AngularJS-解释为什么转置的作用域必须是孤立作用域的同级
在本节中,有以下一段: 然而,隔离作用域会产生一个新问题:如果一个转置的DOM 小部件隔离作用域的子部件将无法绑定 什么都可以。由于这个原因,被转移的作用域是 原始范围,在小部件为其创建独立范围之前 局部变量。这使得被转移和小部件隔离了作用域 兄弟姐妹AngularJS-解释为什么转置的作用域必须是孤立作用域的同级,angularjs,angularjs-directive,Angularjs,Angularjs Directive,在本节中,有以下一段: 然而,隔离作用域会产生一个新问题:如果一个转置的DOM 小部件隔离作用域的子部件将无法绑定 什么都可以。由于这个原因,被转移的作用域是 原始范围,在小部件为其创建独立范围之前 局部变量。这使得被转移和小部件隔离了作用域 兄弟姐妹 有人能解释一下为什么“如果转置的DOM是小部件隔离作用域的子对象,那么它将无法绑定到任何东西”想象一下您有这样的标记: <html ng-app="myApp"> <body> <div ng-contr
有人能解释一下为什么“如果转置的DOM是小部件隔离作用域的子对象,那么它将无法绑定到任何东西”想象一下您有这样的标记:
<html ng-app="myApp">
<body>
<div ng-controller="myController">
<div ng-repeat="item in items">
<div my-widget>
{{item.name}}
</div>
</div>
</div>
</body>
</html>
您可以从范围中读取任意级别以上的值,因为它们使用原型继承相互继承。{{item}}不存在于小部件范围中,但它存在于父ng repeat范围中,因此可以找到它
如果使用隔离作用域,则会得到一个全新的作用域,它不会继承任何内容。因此,如果mywidget
使用scope:{}
例如,作用域树看起来更像:
$rootScope
└controller scope
└ng-repeat scope
widget scope
然后在双卷发中,“项目”是未知的。使用转换,您可以将作用域设置为同级,如下所示:
$rootScope
└controller scope
└ng-repeat scope
└widget contents
widget scope
提到的另一个微妙之处是,如果转置内容的作用域是指令的子项,则指令可能会删除转置内容试图在父项作用域中引用的任何变量。例如:
<body ng-controller="MainCtrl">
<my-directive>{{ name }}</my-directive>
</body>
{{name}}
JS:
app.controller(“MainCtrl”,函数($scope){
$scope.name='foo';
});
app.directive(“myDirective”,function()){
返回{
作用域:{},
是的,
模板:“”,
控制器:功能($scope){
$scope.name='bar';
}
}
});
转换确保指令中的{{name}}引用'foo'而不是'bar'。对我来说,让它被删除更有意义。如果我能在没有排除的情况下重击它,为什么我会因为排除它而突然想要改变这种行为?我可能是因为一个原因而试图破坏它,我认为我们的假设是转换更多地用于库和可重用组件。您可能不想担心名称空间与您正在使用的各种库之间的冲突,而转换为您解决了这一问题。
<body ng-controller="MainCtrl">
<my-directive>{{ name }}</my-directive>
</body>
app.controller("MainCtrl", function($scope) {
$scope.name = 'foo';
});
app.directive("myDirective", function() {
return {
scope: {},
transclude: true,
template: '<span ng-transclude></span>',
controller: function($scope) {
$scope.name = 'bar';
}
}
});