Javascript 如何理解angularjs中指令的scope属性?
在angularjs指令的指南教程中,指令对象可以具有scope属性。它定义了指令的范围 虽然范围atribute值可能为true,但下面是对范围的解释:() true:原型从其父级继承的新子作用域 将为指令的元素创建如果有多个指令打开 同一元素请求一个新范围,但只创建一个新范围。Javascript 如何理解angularjs中指令的scope属性?,javascript,angularjs,angularjs-scope,directive,Javascript,Angularjs,Angularjs Scope,Directive,在angularjs指令的指南教程中,指令对象可以具有scope属性。它定义了指令的范围 虽然范围atribute值可能为true,但下面是对范围的解释:() true:原型从其父级继承的新子作用域 将为指令的元素创建如果有多个指令打开 同一元素请求一个新范围,但只创建一个新范围。 我对粗体的句子感到困惑。同一元素上的多个指令是如何使用同一作用域的?根据我的说法,这意味着作用域将按元素创建,而不是按指令创建 因此,范围将自动在指令之间共享,并且不会为每个指令创建不同的副本 在此链接中 他们提到:
我对粗体的句子感到困惑。同一元素上的多个指令是如何使用同一作用域的?根据我的说法,这意味着作用域将按元素创建,而不是按指令创建 因此,范围将自动在指令之间共享,并且不会为每个指令创建不同的副本 在此链接中 他们提到: 如果您使用的是AngularJS 1.2,那么下一个障碍是您不能将两个隔离范围指令应用于同一个元素。看看下面的代码。它所做的只是对同一个元素应用两个指令。而且,这些指令只需要一个隔离的作用域 因此,如果在两个指令中使用相同的scope变量,那么它将抛出以下错误 错误:错误:multidir 多指令资源争用 多个指令[bnith,bnThis]要求在上创建新的/隔离的作用域 因此,对于这种情况,以嵌套方式转换或放置指令可以完成这项工作 下面的代码片段给出了我上面提到的示例
//为我们的演示创建一个应用程序模块。
var-app=angular.module(“演示”,[]);
// -------------------------------------------------- //
// -------------------------------------------------- //
//我请求一个隔离范围指令。
应用程序指令(
“这个”,
函数(){
//返回指令配置。请注意,我们正在创建
//隔离作用域,即使我们没有绑定任何表达式。
返回({
链接:angular.noop,
限制:“A”,
作用域:{}
});
}
);
// -------------------------------------------------- //
// -------------------------------------------------- //
//我请求一个隔离范围指令。
应用程序指令(
“这一点”,
函数(){
//返回指令配置。请注意,我们正在创建
//隔离作用域,即使我们没有绑定任何表达式。
返回({
链接:angular.noop,
限制:“A”,
作用域:{}
});
}
);代码>
查看控制台输出。
根据我的说法,这意味着范围将按元素而不是按指令创建
因此,范围将自动在指令之间共享,并且不会为每个指令创建不同的副本
在此链接中
他们提到:
如果您使用的是AngularJS 1.2,那么下一个障碍是您不能将两个隔离范围指令应用于同一个元素。看看下面的代码。它所做的只是对同一个元素应用两个指令。而且,这些指令只需要一个隔离的作用域
因此,如果在两个指令中使用相同的scope变量,那么它将抛出以下错误
错误:错误:multidir
多指令资源争用
多个指令[bnith,bnThis]要求在上创建新的/隔离的作用域
因此,对于这种情况,以嵌套方式转换或放置指令可以完成这项工作
下面的代码片段给出了我上面提到的示例
//为我们的演示创建一个应用程序模块。
var-app=angular.module(“演示”,[]);
// -------------------------------------------------- //
// -------------------------------------------------- //
//我请求一个隔离范围指令。
应用程序指令(
“这个”,
函数(){
//返回指令配置。请注意,我们正在创建
//隔离作用域,即使我们没有绑定任何表达式。
返回({
链接:angular.noop,
限制:“A”,
作用域:{}
});
}
);
// -------------------------------------------------- //
// -------------------------------------------------- //
//我请求一个隔离范围指令。
应用程序指令(
“这一点”,
函数(){
//返回指令配置。请注意,我们正在创建
//隔离作用域,即使我们没有绑定任何表达式。
返回({
链接:angular.noop,
限制:“A”,
作用域:{}
});
}
);代码>
查看控制台输出。
我们不知道在使用我们的指令时,范围将包含什么。
因此,为我们的指令提供一个定义明确的公共文件是一种良好的做法
面向接口。这确保了指令不会依赖于或受其影响
使用它的作用域上的任意属性。
对于指令及其模板中要使用的范围,我们有三个选项。这
在指令定义中定义:
•从使用小部件的地方重新使用范围。这是
默认值,对应于范围:false。
•创建子作用域,该子作用域通常继承自
使用小部件。您可以使用scope:true来指定此值。
•创建一个不典型继承的隔离作用域,以便
与父母完全隔离。通过将对象传递给
范围属性:范围:{…}。
我们希望将我们的小部件的模板与系统的其余部分完全解耦
应用程序,以便两者之间不存在数据泄漏的危险
注意:-[虽然隔离作用域不典型地从其父级继承,
它仍然可以访问
scope: {
isolated1: '@attribute1',
isolated2: '=attribute2',
isolated3: '&attribute3'
}
attrs.$observe('attribute1', function(value) {
isolatedScope.isolated1 = value;
});
var parentGet = $parse(attrs['attribute2']);
var parentSet = parentGet.assign;
parentScope.$watch(parentGet, function(value) {
isolatedScope.isolated2 = value;
});
isolatedScope.$watch('isolated2', function(value) {
parentSet(parentScope, value);
});
parentGet = $parse(attrs['attribute3']);
scope.isolated3 = function(locals) {
return parentGet(parentScope, locals);
};