4

我有 AngularJS 开发的 ngList 指令的代码。我想实现类似的东西,但我不理解部分代码。这是代码

var ngListDirective = function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attr, ctrl) {
      var match = /\/(.*)\//.exec(attr.ngList),
          separator = match && new RegExp(match[1]) || attr.ngList || ',';

      var parse = function(viewValue) {
        var list = [];

        if (viewValue) {
          forEach(viewValue.split(separator), function(value) {
            if (value) list.push(trim(value));
          });
        }

        return list;
      };

      ctrl.$parsers.push(parse);
      ctrl.$formatters.push(function(value) {
        if (isArray(value)) {
          return value.join(', ');
        }

        return undefined;
      });
    }
  };
};

以下是我不明白的部分:

  • function(scope, element, attr, ctrl) : ctrl 变量。我在哪里可以阅读更多关于此的信息。
  • ctrl.$parsers.push(解析); : 我在哪里可以阅读更多关于这种用法的信息
  • ctrl.$formatters.push(function(value) {:我需要理解这一点,因为我将尝试实现类似的东西
  • 要求:'ngModel':为什么需要 ngModel
4

1 回答 1

5

首先,感谢阅读源代码!

ctrl是所需指令的控制器(在这种情况下来自于 中ngModel找到的require:

$parsers 和 $formatters- http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController

简而言之,请记住 Angular 必须跟踪ngModel数据的 DOM 表示以及 Angular 模型的表示,$parsers 处理将数据的 DOM 端表示转换为ngModel数据的 Angular 模型视图。$formatters 获取模型视图并将其转换为 DOM 适当的表示形式。所以它们是一对,$parsers 从 DOM 到模型,$formatters 回去。

最后,ngModel. ngList处理ngModel数据。所以它需要找到一个ngModel指令,该指令包含 ngList 应该处理的数据(这让我们绕了一圈,回到ctrl

于 2013-10-17T02:15:58.923 回答