【发布时间】:2014-12-26 04:00:54
【问题描述】:
使用定义控制器的原始方式,访问父级范围相当简单,因为子级范围原型继承自其父级。
app.controller("parentCtrl", function($scope){
$scope.name = "Parent";
})
.controller("childCtrl", function($scope){
$scope.childName = "child of " + $scope.name;
});
<div ng-controller="parentCtrl">
{{name}}
<div ng-controller="childCtrl">
{{childName}}
</div>
</div>
Controller-As 方法 似乎是 recommended 声明控制器的方式。但是对于 Controller-As,上述方法不再有效。
当然,我可以在视图中使用pc.name 访问父作用域:
<div ng-controller="parentCtrl as pc">
{{pc.name}}
<div ng-controller="childCtrl as cc">
{{cc.childName}}
</div>
</div>
我对此确实有一些问题(可能是意大利面条代码),但这个问题是关于从子控制器访问父范围的。
我能看到这个工作的唯一方法是:
app.controller("parentCtrl", function(){
this.name = "parent";
})
.controller("childCtrl", function($scope){
$scope.pc.name = "child of " + $scope.name;
// or
$scope.$parent.pc.name = "child of " + $scope.name;
// there's no $scope.name
// and no $scope.$parent.name
});
所以现在,子控制器需要知道“pc”——除了,这应该(在我看来)仅限于视图。我认为子控制器不应该知道视图决定声明 ng-controller="parentCtrl as pc" 的事实。
问:那么正确的方法是什么?
编辑:
澄清:我不打算继承父控制器。我正在寻找继承/更改共享范围。所以,如果我要修改第一个例子,我应该能够做到以下几点:
app.controller("parentCtrl", function($scope){
$scope.someObj = {prop: "not set"};
})
.controller("childCtrl", function($scope){
$scope.someObj.prop = "changed";
});
【问题讨论】:
-
Angular 的“控制器”实际上更像是“视图助手”或“视图模型”。建议使用
controllerAs的样式指南积极鼓励您直接使用pc或掩盖这种情况。我想你可以在parentCtrl和childCtrl之间建立一个继承链,例如childCtrl.prototype = Object.create(parentCtrl.prototype)然后在你的childCtrl构造函数中,this.name在你隐藏它之前会引用父母的名字。
标签: angularjs angularjs-scope angularjs-controller