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

nik*_*ong 3 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;
       }]
    }
  })
Run Code Online (Sandbox Code Playgroud)

和孩子状态:

  .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;          
    }        
  });
});
Run Code Online (Sandbox Code Playgroud)

是否resolve在孩子的状态只在实例发生的呢?即,一旦子状态从父状态解析对象,它不再侦听已解析对象的更改?似乎不应该是这种情况.

PLNKR可能会漏掉 - 我的代码不会因为未知原因而起作用:http://plnkr.co/edit/EjV4TtSIP6HpVMG0oanL?p = preview

任何方向或见解都表示赞赏.谢谢!

Rad*_*ler 6

你所有的期望都是正确的.并且有一点调整的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;
       }]
    }
Run Code Online (Sandbox Code Playgroud)

主要是线条:

//var object = '';
var object = {};
Run Code Online (Sandbox Code Playgroud)

这样,就$scope.object成了参考对象.这意味着,父母和孩子将共享对该对象的引用.并且在契约中 - 如果有人会改变它(添加属性,更改该属性) - 所有人都将知道更改...因为他们共享对一个对象的引用

检查它在这里