在ui.router父状态中更新已解析的对象

时间:2014-10-07 09:18:30

标签: angularjs angular-ui-router

我的问题有两个:

1 - 我有一个父状态和几个子状态使用ui.router,有一个对象(存储在mongodb中)在所有状态下都需要,但它会被所有状态更新。在这种情况下,使用父状态的解析选项来填充对象是否有意义?

2 - 如果这是正确的方法,我该如何更新"参考" (由ui.router创建的模拟服务注入器)来自每个州的该对象。

为了帮助解释他的想法的一个例子(很多代码被忽略)

.state('parent',resolve:{objectX:return x.promise;},...);

.controller('childstateCtrl',$scope,objectX){
    $scope.data.objectX = objectX;
    $scope.someEvent =function(){ 
    // something updates objectX on the scope
    }
}

.controller('otherChildCtrl',$scope,objectX){
    // how to get the updated objectX?
}

提前致谢

2 个答案:

答案 0 :(得分:4)

不完全确定我是否可以看到问题的位置......但如果您正在寻找如何共享对更新的参考的访问权限的方法,那么应该很容易。有an example

让我们拥有这些状态

$stateProvider
  .state('root', {
    abstract: true,
    template: '<div ui-view></div>',
    resolve: {objectX : function() { return {x : 'x', y : 'y'};}},
    controller: 'rootController',
  })
  .state('home', {
    parent: "root",
    url: '/home',
    templateUrl: 'tpl.example.html',
  })
  .state('search', {
    parent: "root",
    url: '/search',
    templateUrl: 'tpl.example.html',
  })
  .state('index', {
    parent: "root", 
    url: '/index',
    templateUrl: 'tpl.example.html',
  })

仅使用一个控制器(对于根状态):

.controller('rootController', function($scope, objectX){
  $scope.data = { objectX: objectX };
})

对于此示例,这是共享模板:

<div>
  <h3>{{state.current.name}}</3>

  x <input ng-model="data.objectX.x"/>
  y <input ng-model="data.objectX.y"/>
</div>

因此,在这种情况下,父(root)已将对象数据注入$ scope。然后继承该引用,如下所述:

Scope Inheritance by View Hierarchy Only

在行动here中检查该示例。如果您需要更多详细信息(请参阅上面的链接,请查看此Q&A

答案 1 :(得分:2)

您可以将其存储在服务中。

.service("myService", function($q) { 
  // the actual data is stored in a closure variable
  var data = undefined;
  return { 
    getPromise: function() { // promise for some data
      if (data === undefined) // nothing set yet, go fetch it
        return $http.get('resourceurl').then(function(value) { data = value; return data; });
      else
        return $q.when(data); // already set, just wrap in a promise.
    },
    getData: function() { return data; }, // get current data (not wrapped)
    setData: function(newDataVal) { data = newDataVal; } // reset current data
  }
})

// `parent` wont' enter until getPromise() is resolved. 
.state('parent', resolve:{objectX: function(myService) { return myService.getPromise(); } });

.controller('childstateCtrl', $scope, myService) {
    $scope.data.objectX = myService.getData();
    $scope.someEvent = function(someData){ 
      myService.setData(someData);
    }
}

.controller('otherChildCtrl', $scope, myService){
    // how to get the updated objectX?
    var data = myService.getData();
}