我是Angular世界的新手,我想知道是否使用$parent
全局变量来访问父范围是一个好习惯。例如,data-ng-if
会创建一个隔离的作用域,这会导致访问父作用域时遇到一些问题,所以唯一的方法是$parent.myVariable
。
任何例子,任何建议,以确保我的代码是干净的,遵循良好的做法将是可观的。
我是Angular世界的新手,我想知道是否使用$parent
全局变量来访问父范围是一个好习惯。例如,data-ng-if
会创建一个隔离的作用域,这会导致访问父作用域时遇到一些问题,所以唯一的方法是$parent.myVariable
。
任何例子,任何建议,以确保我的代码是干净的,遵循良好的做法将是可观的。
ng-if
指令应该看到父范围,不管see demo。
在有关指令的分离范围的情况下,最好的传球$scope
对象向下通过一个接口,而不是指望物业工作中存在的$parent
:
app.controller("myCtrl", function($scope){
$scope.foo = "bar";
});
app.directive("myDirective", function(){
return {
scope: {
// expect foo to be passed to the directive
// = means conserve bi directional binding
foo: "="
},
link: function(scope) {
... // scope.foo is defined
}
}
});
在视图
<div ng-controller="myCtrl">
<my-directive foo="foo"></my-directive>
</div>
最好的做法是让你的指令解耦,它应该是自包含的,如果指令需要外部方面,你可以注入它们或绑定它们。不适合依靠某些特定环境中使用的东西。
一个例子是:
<div ng-controller="Parent as parent">
<div ng-if="parent.showMessage">
Some simple message.
</div>
<div child-one parent="parent"></div>
</div>
控制器
app.controller('Parent', function() {
var self = this;
self.showMessage = true;
});
app.directive('childOne', function() {
return {
controllerAs: 'childOne',
controller: function($scope, $attrs) {
var parent = $scope.$eval($attrs.parent);
var self = this;
self.foo = 'bar';
// Some simple logic.
if (self.foo === 'bar') {
parent.showMessage = false;
}
}
};
});
似乎完全没这样做。
<div ng-app ng-controller="NameCtrl">
<div ng-controller="ChildCtrl as vm">
{{$parent.names}}
</div>
</div>
function NameCtrl($scope) {
$scope.names = ["Tom", "Dick", "Harry"];
}
function ChildCtrl($scope) {
$scope.parentnames = $scope.$parent.names;
}
参见:http://jsfiddle.net/8bojdnpt/
从一个很好的做法来看,这种方法也不错,因为你也可以摧毁不需要的范围,使他们不留在缓冲区中。
但是,约翰帕帕建议不要使用$parent
:https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#controllers。相反,他宁愿使用controller as
语法。
这不是一个好习惯,它会给你带来麻烦。假设你有一个绑定到控制器的<div>
和一个<div ng-if>
,你决定在你的潜水中使用{{ $parent.myVariable }}
。如果您需要嵌入另一个ng-if
,会发生什么情况?或者删除唯一的ng-if
?
我建议你把变量保存在存储在控制器$scope
变量中的对象中。
所以你应该在你的控制器中有这样的东西。
$scope.MyValues = {};
$scope.MyValues.myVariable = 5;
现在你能避免使用$parent
您<div>
内安全地寻找{{ MyValues.myVariable }}
和角度将回落至$parent
,直到它找到MyValues
对象,这样你就可以(几乎)忘记ng-if
范围的问题。这同样适用于嵌套控制器。
这里快速参考这些类型的最佳实践:learn-how-to-use-scopes-properly-in-angularjs
'NG-if'不会创建一个分离范围;它创建了一个继承范围。 – georgeawg