私のアプリケーションは、このように $rootScope でオブジェクト グラフを初期化します ...
var myApp = angular.module('myApp', []);
myApp.run(function ($rootScope) {
$rootScope.myObject = { value: 1 };
});
...そして、このように、そのオブジェクトグラフからデータを消費します(一方向バインディングのみ)...
<p>The value is: {{myObject.value}}</p>
これは問題なく動作しますが、その後 (ページのレンダリングが完了した後) $rootScope を更新して元のオブジェクトを新しいオブジェクトに置き換えようとすると、無視されます。これは、元のオブジェクトを置き換えても、AngularJS が元のオブジェクトへの参照を保持しているためだと最初は思いました。
ただし、消費する HTML をコントローラーでラップすると、そのスコープを意図した方法で繰り返し更新することができ、変更がページに正しく反映されます。
myApp.controller('MyController', function ($scope, $timeout) {
$scope.myObject = { value: 3 };
$timeout(function() {
$scope.myObject = { value: 4 };
$timeout(function () {
$scope.myObject = { value: 5 };
}, 1000);
}, 1000);
});
$rootScope を介してこれを達成する方法はありますか、またはコントローラー内でのみ実行できますか? また、そのような操作を実装するためのより推奨されるパターンはありますか? 具体的には、AngularJS コードの外部から AngularJS によって消費される完全なオブジェクト グラフを置き換える方法が必要です。
あなたの提案を前もってありがとう、ティム
編集: コメントで提案されているように、$apply 内で変更を実行しようとしましたが、役に立ちません:
setTimeout(function() {
var injector = angular.injector(["ng", "myApp"]);
var rootScope = injector.get("$rootScope");
rootScope.$apply(function () {
rootScope.myObject = { value: 6 };
});
console.log("rootScope updated");
}, 5000);