Angular UI-Router从子级更新父范围

时间:2014-03-03 15:13:28

标签: javascript angularjs angular-ui angular-ui-router

这是我的应用程序的示例设置

 .state('base', {
      controller: 'resourceCtrl'
      view: 'resource.html'
 }
 .state('base.edit', {
      controller: 'resourceEditCtrl'
      view: 'resourceEdit.html'
 }

在resourceCtrl中,我将$ scope.resource分配给api调用的promise以获取单个资源。

 API.getResource(id).then(resource){
      $scope.resource = resource;
 }

在resourceEditCtrl中,我然后使用$ scope.resource的这个继承的$ scope变量来编辑它

 $scope.$watch('resource', function(r){
      if(r){
           $scope.resourceToEdit = angular.copy(r);

           $scope.save = function(){
                //some changes are made to $scope.resourceToEdit in the view
                //eg: change the title, description, etc

                ////////
                //////// THIS IS THE PART THAT DOESNT WORK
                ////////
                //////// try to update parent $scope.resource with newly saved value
                $scope.resource = $scope.resourceToEdit;

                $scope.transitionTo('base');

           }
      }
 }

当我转换回baseCtrl时,新保存的值消失了,它仍处于原始状态。如果我刷新,由于调用API,值将更新,但理想情况下,我将能够更新父范围变量以与新保存的值同步,因此不需要刷新。

这可能吗?

编辑:

这是一个demo plunkr

http://plnkr.co/edit/8OK1VR8tLN4BAyQaMs3d?p=preview

5 个答案:

答案 0 :(得分:4)

你应该可以这样:

$scope.$parent.resource = $scope.resourceToEdit

假设base是资源控制器的父级。

答案 1 :(得分:4)

更有棱角的方法是创建一个注入两个控制器的服务。由于注入的对象是单例,因此当每个控制器更新数据时,数据将被共享/更新:

http://fdietz.github.io/recipes-with-angular-js/controllers/sharing-code-between-controllers-using-services.html

答案 2 :(得分:2)

我的方法是在父级中编写一个修改其$ scope的函数,因为父作用域在子级中始终可用,但不是反之亦然

父范围

$scope.parentVar = 'A value';

$scope.modifyParentScope = function(variable) {
    $scope.parentVar = variable;
}

儿童范围

$scope.childVar = 'A new value';

$scope.modifyParentScope($scope.childVar);

这样可以避免$scope.$parent个问题。当然另一种方法是使用rosswil的示例并创建一个共享所有变量的factoryservice

答案 3 :(得分:1)

在控制器中注入$ rootScope并正常使用它。

答案 4 :(得分:0)

我的解决方案是通过事件将子项中的所有变量发送到父项,并将它们影响到父作用域和仅此作用域。这样我就不会在范围之间出现冲突或不一致。

如果您开始命名ui-view

@ Pieter的解决方案无效。