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: truescope: {}scope: false

每个范围的行为都不同。您要查找的范围是scope: {},或scope: true

如果您使用 scope: {},您需要确保其中的元素使用正确的语法 =@&。在您的情况下,您需要使用 @ 符号。

符号说明:Explanation

@:将此属性作为字符串传递 =:数据将此 属性 绑定到指令的父范围。 &:从父作用域传入一个函数,稍后调用。用于传递延迟计算的 angular 表达式。