【问题标题】:angularjs directive from jquery plugin来自 jquery 插件的 angularjs 指令
【发布时间】:2014-06-10 06:10:32
【问题描述】:

在浏览了 Angularjs 的文档后,我希望有人可以帮助澄清我面临的问题。我正在寻找一个包含 jQuery 插件的指令,但我不确定这样的最佳实践。它本质上是一个移植,使 jquery 插件与 angular 很好地配合,并使其更具参数化和可扩展性。

我要移植的插件主要是 DOM 操作(像大多数 jQuery 库一样)来处理表单;如有必要,我可以发布更多代码,但我主要想知道最佳实践或将其构建为 Angular 时需要注意的事项。

谢谢!!

到目前为止我的指令:

'使用严格';

/**
 * @ngdoc directive
 * @name goodStewardApp.directive:card
 * @description
 * # card
 */
angular.module('goodStewardApp')
  .directive('card', function() {
    return {
      template: "<card> What is this madness? </card>",
      restrict: 'A',
      link: function() {
        // jQuery function here
      };

  };
});

【问题讨论】:

    标签: javascript jquery angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    如果插件很简单并且没有任何回调,那么代码很简单:

    angular.module('goodStewardApp').directive('card', function() {
        return {
            template: "<card> What is this madness? </card>",
            restrict: 'A',
            link : function(scope, element, attr) {
                $(element).plugin();
            }
        };
    });
    

    但是,如果插件有任何自定义事件或回调,那么您需要将它们包装在$apply()

    angular.module('goodStewardApp').directive('datepicker', function () {
        return {
            restrict: 'A',
            require: 'ngModel',
            link: function (scope, element, attrs, ngModelCtrl) {
                var options = scope.$eval(attrs['datepicker']);
    
                $(function () {
                    element.datepicker({
                        dateFormat: options['dateFormat'],
                        onSelect: function (date) {
                            scope.$apply(function () {
                                ngModelCtrl.$setViewValue(date);
                            });
                        }
                    }).prop('readonly', true).addClass('datepicker');
                });
            }
        };
    });
    

    【讨论】:

    • 谢谢!所以我对未来的理解更好,$apply 是否将回调/事件集成到一般的 Angular 循环中?或者它们是否以相对于范围不同的方式合并?
    • 这正是$apply 所做的!当在$apply 内部调用某些东西时,Angular 知道他需要重新计算范围。如果没有$apply,输入中的值将被更改,但模型将不会同步(ngModel 在按键上触发循环,但不会在直接value 更改时触发)。阅读有关NgModelCtrl 的更多信息,了解如何使数据与视图保持同步。
    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多