我正在创建一个需要来自父控制器的一些数据的指令。将数据放入控制器中,scope
使得$scope.data = myData;
数据可以在指令中访问。我看到我们使用隔离范围将数据从控制器传递到指令。但是在这里我为什么要为此使用隔离范围。? 只是为了标准化目的吗?
2 回答
隔离范围使组件可重用并允许控制绑定:单向或双向。
如果您使用继承范围,这意味着您将在父范围内搜索值,这会降低组件的可重用性。在使用父级范围的数据时,您如何能够使用两次具有不同数据的相同组件?你就是不能。
请注意,您还可以使用属性(attrs
链接函数中的参数)来读取值。但是为了刷新组件的视图,需要始终观察变化。当您使用绑定时,您也不需要,除非您有一些特定的过程。
例如,假设您创建了一个指令来使文本变为粗体。如果您使用隔离范围,则必须执行以下操作:
scope:{
text:'@myText'
},
template : <strong>{{text}}</strong>
现在,如果您使用属性,则必须这样做:
scope:false,
template : <strong>{{text}}</strong>
link:function(scope, element, attrs){
attrs.$observe('myText', function(newValue){
scope.text = newValue;
});
}
这使您编写更多代码,而不是依赖 angularJS,因此有更多机会插入错误。
编辑:这是另一篇关于插值和解析的很好答案的帖子:使用 $attrs 来评估带有花括号的属性
JavaScript 代码:
var app = angular.module("test",[]); app.controller("Ctrl1",function($scope){ $scope.name = "Harry"; $scope.reverseName = function(){ $scope.name = $scope.name.split('').reverse().join(''); }; }); app.directive("myDirective", function(){ return { restrict: "EA", scope: {}, template: "<div>Your name is : {{name}}</div>"+ "Change your name : <input type='text' ng-model='name'/>" }; });
HTML:
<div ng-app="test"> <div ng-controller="Ctrl1"> <h2 ng-click="reverseName()">Hey {{name}}, Click me to reverse your name</h2> <div my-directive class='directive'></div> </div> </div>
我们刚刚创建了一个具有隔离范围的指令。请注意,即使父范围有一个名称“Harry”,指令内的文本框也是空白的。这是因为新的独立作用域对其父作用域一无所知。
但是,我们现在可以将一些值从父作用域传递给指令吗?
是的 !不仅如此,我们可能需要处理诸如在父作用域中调用回调、在父作用域和指令作用域之间进行双向绑定等情况。
要访问任何父范围数据,我们需要将其显式传递给我们的指令。这是通过在 DDO 中设置范围对象的属性来实现的。将这些属性想象为指令的接口以与外部范围进行通信。另一个重要的事情是,这些属性也必须设置为指令 html 元素的属性。
查看指令模板,我们可以看到其中使用了范围属性。大多数指令的模板和链接功能将使用范围属性。这些属性的行为再次取决于它们的值——也称为前缀——提供。这些前缀用于将父作用域的方法和属性绑定到指令作用域。
- “@”(文本绑定/单向绑定)
- “=”(直接模型绑定/双向绑定)
- “&”(行为绑定/方法绑定)
“@”前缀是指令作用域和父作用域之间的一种单向绑定。它总是期望映射的属性是一个表达式。这个非常重要; 因为要使“@”前缀起作用,我们需要将属性值包装在 {{}} 中。由于“@”在父作用域和指令作用域之间创建单向绑定,因此在父作用域中所做的任何更改都将反映在指令作用域内,而不是其他方式。当我们的指令需要使用父作用域中的一些数据进行初始化时,“@”前缀非常有用。
其次,我们有“=”前缀。它在父作用域和指令作用域之间创建双向绑定。关于“=”前缀最重要的一点是,它总是期望属性值是模型名称。这意味着您不能提供表达式作为映射到“=”前缀的属性值。当我们的任何指令作用域属性与父作用域属性相同时,这很有用。
最后,我们将讨论最后一个前缀。“&” 前缀也称为方法绑定。这用于将任何方法从父范围绑定到指令范围。当我们的指令需要在父范围内执行任何回调时,这将特别有用。查看代码,看看“&”的属性值如何 要设置的前缀。
请参阅下面的链接以了解角度 JS 中的孤立范围。
https://www.undefinednull.com/2014/02/11/mastering-the-scope-of-a-directive-in-angularjs/