这是我的应用程序的示例设置
.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
答案 0 :(得分:4)
你应该可以这样:
$scope.$parent.resource = $scope.resourceToEdit
假设base是资源控制器的父级。
答案 1 :(得分:4)
更有棱角的方法是创建一个注入两个控制器的服务。由于注入的对象是单例,因此当每个控制器更新数据时,数据将被共享/更新:
答案 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的示例并创建一个共享所有变量的factory
或service
。
答案 3 :(得分:1)
在控制器中注入$ rootScope并正常使用它。
答案 4 :(得分:0)
我的解决方案是通过事件将子项中的所有变量发送到父项,并将它们影响到父作用域和仅此作用域。这样我就不会在范围之间出现冲突或不一致。
如果您开始命名ui-view
,@ Pieter的解决方案无效。