1

file.jade ファイルに次のコードをコントローラー fileCtrl に添付します。

file.jade

.....
label(for='id') Id: 
input(ng-model='form.id', name='id')
p
....

ファイル Ctrl

...
  $scope.submitMain = function ( path ) {
      $http.post('/api/submitMain', $scope.form).
      success(function(data) {
        alert("Submit Main Data: " + data);
        $rootScope.id = data;
        $location.path(path);
      });
  };
....

パスは、同じ id フィールドを持ち、file1Ctrl にアタッチされている file1.jade を指します。

file1.jade

.....
label(for='id') Id: 
input(ng-model='form.id', name='id')
p
....

file1Ctrl

$scope.form.id = $rootScope.id;

何らかの理由で、Filectrl に設定された $rootScope id は、値が両方の場所で正しいにもかかわらず、file1Ctrl の form.id 値を設定していません。

どんな援助でも大歓迎です。

メルロイ

4

1 に答える 1

0

SergeL が言ったように、$rootScope を介して渡したい場合は、$watch を実行する必要があります。$watch は、指定された式の変更を監視し、変更があった場合にスクリプトを起動し、任意のスコープで使用できます。

$rootScope.$watch('id', function(newVal, oldVal){
    if (newVal !== undefined) {
        $scope.form.id = newVal;
    }
});

ウォッチは未定義の値で開始時にトリガーされることに注意してください。そのため、使用する前に値があることを確認する必要がある場合があります。


ただし、監視が必要なため、$rootScope を使用するのは最善の方法ではない可能性があります。また、コントローラ間でデータを共有する必要がある大規模なプロジェクトでは、rootScope に大量のデータが格納される可能性があり、競合が発生する可能性が非常に高くなります。 . より良い方法は、サービスを使用して情報を共有することです。

Angular のサービスはシングルトンであり、1 つのインスタンスにのみ存在します。つまり、2 つのコントローラーが同じサービスを使用すると、同じデータを共有します。データを共有するためのサービスを次のように定義します。

.factory('IdStorage', [function() {
    return {};
}])

これにより、本質的に単なるオブジェクトであるサービスが作成されます。サービスは 1 つのインスタンスにしか存在しないため、そのオブジェクトはサービスを使用するすべてのものの間で共有されます。したがって、コールバックで次のことができます。

IdStorage.id = data;

そして、コントローラーで次のことを行います。

$scope.form.id = IdStorage;

どちらも同じオブジェクトを参照しているため (シングルトンであるため)、常に同じです。IdStorage は単なるオブジェクトであるため、必要に応じてより多くの情報を格納できます。また、アプリ全体でさまざまなものを共有する必要がある場合は、そのようなサービスを複数作成できるため、すべてを $rootScope にダンプする場合のような競合のリスクを冒すことはありません。

于 2013-09-16T20:41:05.993 に答える