angularjs 在两个模板之间共享自定义指令
angularjs share custom directive between two templates
我有一个带有下一个参数的自定义指令
return {
scope: {
ngModel: '='
},
require: "ngModel",
link: function (scope, element, attrs, ngModel) {
// directive code ...
}
和两个使用该指令的模板
//template 1
<div class="panel-body">
<div ng-include src="'email.html'"></div>
</div>
// email.html
<div id="template"
ng-model="emailNotification"
custom-directive></div>
// template 2
<div class="panel-body">
<div ng-include src="'sms.html'"></div>
</div>
// sms.html
<div id="template"
ng-model="smsNotification"
custom-directive></div>
这里的问题是当我在这两个模板之间切换时,'custom-directive' 中的 ng-model 不会刷新并且两个不同的 ng-model 之间的值共享。但是我希望该指令不会那样做。
我的错误在哪里,为什么指令共享这个变量?
当您使用 = 运算符时,指令的作用域 属性 通过相同的名称绑定到父作用域 属性。由于您在同一父级指令的两个实例上都使用了 ng-model,因此它们最终都引用了相同的 ng-model。
如果要从父作用域计算 属性 的值,请使用 @ 绑定。
return {
scope: {
ngModel: '@'
},
require: "ngModel",
link: function (scope, element, attrs, ngModel) {
// directive code ...
}
指令的范围有几种不同的形式。您可以根据期望的结果使用它们。它们是 scope: true
、scope: {}
、scope: false
。
每个范围的行为都不同。您要查找的范围是scope: {}
,或scope: true
。
如果您使用 scope: {}
,您需要确保其中的元素使用正确的语法 =
、@
和 &
。在您的情况下,您需要使用 @
符号。
符号说明:Explanation
@
:将此属性作为字符串传递
=
:数据将此 属性 绑定到指令的父范围。
&
:从父作用域传入一个函数,稍后调用。用于传递延迟计算的 angular 表达式。
我有一个带有下一个参数的自定义指令
return {
scope: {
ngModel: '='
},
require: "ngModel",
link: function (scope, element, attrs, ngModel) {
// directive code ...
}
和两个使用该指令的模板
//template 1
<div class="panel-body">
<div ng-include src="'email.html'"></div>
</div>
// email.html
<div id="template"
ng-model="emailNotification"
custom-directive></div>
// template 2
<div class="panel-body">
<div ng-include src="'sms.html'"></div>
</div>
// sms.html
<div id="template"
ng-model="smsNotification"
custom-directive></div>
这里的问题是当我在这两个模板之间切换时,'custom-directive' 中的 ng-model 不会刷新并且两个不同的 ng-model 之间的值共享。但是我希望该指令不会那样做。
我的错误在哪里,为什么指令共享这个变量?
当您使用 = 运算符时,指令的作用域 属性 通过相同的名称绑定到父作用域 属性。由于您在同一父级指令的两个实例上都使用了 ng-model,因此它们最终都引用了相同的 ng-model。
如果要从父作用域计算 属性 的值,请使用 @ 绑定。
return {
scope: {
ngModel: '@'
},
require: "ngModel",
link: function (scope, element, attrs, ngModel) {
// directive code ...
}
指令的范围有几种不同的形式。您可以根据期望的结果使用它们。它们是 scope: true
、scope: {}
、scope: false
。
每个范围的行为都不同。您要查找的范围是scope: {}
,或scope: true
。
如果您使用 scope: {}
,您需要确保其中的元素使用正确的语法 =
、@
和 &
。在您的情况下,您需要使用 @
符号。
符号说明:Explanation
@
:将此属性作为字符串传递
=
:数据将此 属性 绑定到指令的父范围。
&
:从父作用域传入一个函数,稍后调用。用于传递延迟计算的 angular 表达式。