如何从AngularJS指令中引用元素的scope/model属性?

如何从AngularJS指令中引用元素的scope/model属性?,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,我使用一个自定义指令将jQuery插件附加到一个多选元素。(我意识到有原生的AngularJS插件,但我想学习如何以正确的方式集成jQuery插件,因为我相信我最终会遇到一个只存在jQuery插件的需求。) 元素已经绑定到一个范围模型属性,在指令中,我在这个模型属性上附加了一个监视处理程序,以确保插件的update/refresh函数在每次更改时都被调用。然而,我目前正在通过将模型属性的名称硬编码到指令中来实现这一点,这显然是不理想的。我希望指令能够自己解决这个问题,这样它就可以在各种情况下使用

我使用一个自定义指令将jQuery插件附加到一个多选元素。(我意识到有原生的AngularJS插件,但我想学习如何以正确的方式集成jQuery插件,因为我相信我最终会遇到一个只存在jQuery插件的需求。)

元素已经绑定到一个范围模型属性,在指令中,我在这个模型属性上附加了一个监视处理程序,以确保插件的update/refresh函数在每次更改时都被调用。然而,我目前正在通过将模型属性的名称硬编码到指令中来实现这一点,这显然是不理想的。我希望指令能够自己解决这个问题,这样它就可以在各种情况下使用。我想我可以通过一个属性值将它传递到指令中,但我更希望指令足够聪明,能够自己解决它

是否存在从元素对象到其绑定范围模型属性的引用路径

HTML:


。请注意,clear按钮工作正常,因为该指令使用了一个watch来更新jQuery选择的插件。(注意:jQuery JS和所选CSS链接被省略,因为它们是从JSFIDLE中定义的。)

每当您创建这样一个可重用指令时,您都要确保为它提供隔离范围()

在隔离作用域对象中,您可以使用以下内容将ng模型属性的值绑定到指令的作用域:model:“=ngModel”,然后您只需查看您在指令作用域上放置的模型属性。您可以通过将true作为第三个要监视的参数来选择深入监视该属性,尽管在本例中您不需要这样做

testApp.directive('jqueryNgChosen', function () {
    return {
        scope: {
            'model': '=ngModel',
        },
        link: function (scope, element, attrs) {
            element.chosen();
            scope.$watch('model', function (newValue, old) {
                element.trigger("chosen:updated");
            }, true);
        }
    };
});

无论何时创建这样的可重用指令,都要确保为其提供隔离作用域()

在隔离作用域对象中,您可以使用以下内容将ng模型属性的值绑定到指令的作用域:model:“=ngModel”,然后您只需查看您在指令作用域上放置的模型属性。您可以通过将true作为第三个要监视的参数来选择深入监视该属性,尽管在本例中您不需要这样做

testApp.directive('jqueryNgChosen', function () {
    return {
        scope: {
            'model': '=ngModel',
        },
        link: function (scope, element, attrs) {
            element.chosen();
            scope.$watch('model', function (newValue, old) {
                element.trigger("chosen:updated");
            }, true);
        }
    };
});

无论何时创建这样的可重用指令,都要确保为其提供隔离作用域()

在隔离作用域对象中,您可以使用以下内容将ng模型属性的值绑定到指令的作用域:model:“=ngModel”,然后您只需查看您在指令作用域上放置的模型属性。您可以通过将true作为第三个要监视的参数来选择深入监视该属性,尽管在本例中您不需要这样做

testApp.directive('jqueryNgChosen', function () {
    return {
        scope: {
            'model': '=ngModel',
        },
        link: function (scope, element, attrs) {
            element.chosen();
            scope.$watch('model', function (newValue, old) {
                element.trigger("chosen:updated");
            }, true);
        }
    };
});

无论何时创建这样的可重用指令,都要确保为其提供隔离作用域()

在隔离作用域对象中,您可以使用以下内容将ng模型属性的值绑定到指令的作用域:model:“=ngModel”,然后您只需查看您在指令作用域上放置的模型属性。您可以通过将true作为第三个要监视的参数来选择深入监视该属性,尽管在本例中您不需要这样做

testApp.directive('jqueryNgChosen', function () {
    return {
        scope: {
            'model': '=ngModel',
        },
        link: function (scope, element, attrs) {
            element.chosen();
            scope.$watch('model', function (newValue, old) {
                element.trigger("chosen:updated");
            }, true);
        }
    };
});

要获取
ng model
属性中的值,可以使用
attrs.ngModel
如下:

link: function (scope, element, attrs) {
  element.chosen();
  scope.$watch(attrs.ngModel, function () {
    element.trigger("chosen:updated");
  });
}
这样,如果属性实际上是
ng model
data ng model
ng:model
或其他变体,您就不必担心了。它将通过角度标准化


希望这有帮助。

要获取
ng model
属性中的值,可以使用
attrs.ngModel
如下:

link: function (scope, element, attrs) {
  element.chosen();
  scope.$watch(attrs.ngModel, function () {
    element.trigger("chosen:updated");
  });
}
这样,如果属性实际上是
ng model
data ng model
ng:model
或其他变体,您就不必担心了。它将通过角度标准化


希望这有帮助。

要获取
ng model
属性中的值,可以使用
attrs.ngModel
如下:

link: function (scope, element, attrs) {
  element.chosen();
  scope.$watch(attrs.ngModel, function () {
    element.trigger("chosen:updated");
  });
}
这样,如果属性实际上是
ng model
data ng model
ng:model
或其他变体,您就不必担心了。它将通过角度标准化


希望这有帮助。

要获取
ng model
属性中的值,可以使用
attrs.ngModel
如下:

link: function (scope, element, attrs) {
  element.chosen();
  scope.$watch(attrs.ngModel, function () {
    element.trigger("chosen:updated");
  });
}
这样,如果属性实际上是
ng model
data ng model
ng:model
或其他变体,您就不必担心了。它将通过角度标准化


希望这能有所帮助。

这不是通过观看整个模型而不是特定属性来欺骗吗?对于大型车型来说,这不是效率低下吗?我找到了另一种方法,那就是从element.attr('ng-model')获取模型属性。看见但这似乎有点脆弱,因为属性名称也可能是data ng model,甚至可能以其他方式绑定。如果您谈论的是深度监视,那么是的,它可能效率低下,但在您开始真正看到性能影响之前,通常避免担心速度优化是一个好主意。即使看到ref元素attr('ng-model')返回,您仍然希望给出指令隔离范围。这两种解决方案都是脆弱的,因为它是由约定而不是显式配置定义的。您的指令可以指定要监视的属性必须通过一个名为thingy的属性传入,但这对我来说并不比说它必须是ng model好。谢谢您解释了隔离作用域的内容。通过监视整个模型而不是特定的属性,这不是一种欺骗吗?对于大型车型来说,这不是效率低下吗?我找到了另一种方法,那就是从element.attr('ng-model')获取模型属性。看见但这似乎有点脆弱,因为属性名称也可以是da