AngularJS UI-Router:子/父状态中已解析对象之间的双向绑定 - 子状态未获得更新

时间:2015-05-31 20:37:34

标签: javascript angularjs angular-ui-router

我有父州和子州。父状态解析一个对象。然后,子状态从父状态解析该对象。

因为子状态是从父状态解析对象,所以我希望发生双向绑定。奇怪的是,虽然从子状态改变(即添加属性),更新父状态中的对象 - 父状态中对象的更改不会影响子状态中的已解析对象,这让我感到惊讶。

我知道我可以将父状态中已解析对象的$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

赞赏任何方向或见解。谢谢!

1 个答案:

答案 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