web-dev-qa-db-ja.com

angular ui-routerの親状態を作成するには、状態が変化したときに常にコントローラーコードを実行しますか?

$ stateProviderで次のように定義された親子関係があるとします。

    .state('myProfile', {
        url: "/my/profile",
        templateUrl: 'my/profile.html',
        controller: 'MyProfileController'
    }).state('myProfile.edit', {
        url: "/edit",
        templateUrl: 'my/profile.edit.html',
        controller: 'EditMyProfileController'
    });

ここでの考え方は、親のmyProfile状態は編集不可ですが、子のmyProfile.edit状態は、プロファイルを編集するための実際のフォームです。これがプロファイルページの動作方法であるかどうかは無視してください。私は物事をいじって学習しています。

ユーザーがフォームを送信すると、$ stateオブジェクトを使用して親ページに戻ります。

$scope.save = function() {
    userResource.update($scope.user, function() {
        SessionService.refresh();

        $state.go('myProfile'); // also tried with reload: true as well
    });
}

ユーザーがプロファイルデータを保存した後isが正しく保存されます-F5を押してブラウザーを更新しない限り、親のビューは更新されません。

私が気づいたことの1つは、子供を作るとmyProfile.edit状態をmyProfile状態の子ではなく、親自体に変更すると、この問題は実際にはなくなり、予期したとおりに動作します(ただし、レイアウトはこのように見えます)。

UIルーターが親の結果をキャッシュしているようです。モデルの変更があったことや、コントローラーを再実行する必要があることは疑いません。

myProfileページが常にコントローラーを実行してデータを再ロードしている間に、親子関係を維持するにはどうすればよいですか?基本的に、私はこれを$stateが使用されているか、myProfileへのリンクがクリックされたとき。どうやってやるの?

そして、私が求めることを実行できない場合、一連の子状態を設定してそれらを意図したとおりに機能させることができることを知っています...しかし、親のデフォルトの子状態をどのように設定できますか?たとえば、myProfile.editmyProfileのデフォルトの子状態にするには-どうすればよいですか?

ありがとう!

28
egervari

子ステートから親ステートに移動するときに親ステートを強制的にリロードするには、以下の両方の方法を使用できます。純粋なjsまたはディレクティブ属性。

<a ui-sref="myProfile" ui-sref-opts="{ reload: true }">Back to My Profile</a>

または

$state.go('myProfile', null, { reload: true });
35
Afonso Praça

「$ stateChangeStart」イベントをリッスンしたり、$ state.reload()を使用したりしましたか?

3
adrichman

$ state.goにバグがあり、リロードオプションが除外されているようです。 $ state.transitionToは私のために動作します。

$state.transitionTo('state',null,{reload: true});
2
Ammadu