我有父州和子州。父状态解析一个对象。然后,子状态从父状态解析该对象。
因为子状态是从父状态解析对象,所以我希望发生双向绑定。奇怪的是,虽然从子状态改变(即添加属性),更新父状态中的对象 - 父状态中对象的更改不会影响子状态中的已解析对象,这让我感到惊讶。
我知道我可以将父状态中已解析对象的$broadcast
更改为子状态,但我想了解为什么子状态中的已解析对象未自动更新。
这是我与之合作的内容。父州:
.config(function($stateProvider) {
$stateProvider.state('parent', {
template: ''
+' <div>Parent State</div>'
+' <div>Modify property on parent state, object.someProperty:'
+' <input ng-model="object.someProperty">'
+' {{object.someProperty}}'
+' </div>'
+' </div>'
+' Include Child State'
+' <ui-view></ui-view>',
controller: function($scope) {
$scope.object = object;
},
resolve: {
object: [function() {
var object = '';
object.someProperty = 'initialValue';
return object;
}]
}
})
和孩子说:
.state('parent.child', {
template: ''
+' <div>Child State</div>'
+' <div>Watch property from parent state, object.someProperty'
+' {{object.someProperty}}'
+' </div>',
resolve: {
objectFromParent: ['object', function(object) {
return object;
}]
},
controller: function(objectFromParent) {
$scope.objectFromParent = objectFromParent;
}
});
});
子状态中的resolve
仅在实例化时发生吗?即,一旦子状态从父状态解析对象,它不再侦听已解析对象的更改?看起来并非如此。
PLNKR可能会出问题 - 我的代码因未知原因而无法工作: http://plnkr.co/edit/EjV4TtSIP6HpVMG0oanL?p=preview
赞赏任何方向或见解。谢谢!
答案 0 :(得分:6)
您的所有期望都是正确的。并且有bit adjusted plunker正在运作。
最重要的变化是使共享对象成为真实对象(而不是字符串)
$stateProvider.state('parent', {
url: '/parent',
template: ...,
controller: function($scope, object) {
$scope.object = object;
},
resolve: {
object: [function() {
//var object = '';
var object = {};
object.someProperty = 'initialValue';
return object;
}]
}
主要是以下几行:
//var object = '';
var object = {};
这样, $scope.object
成为参考对象。这意味着,父母和孩子将共享对该对象的引用。并且在行动中 - 如果有人会改变它(添加属性,更改该属性) - 所有人都将知道更改...因为他们共享对一个对象的引用
检查here