4

我是解析器和格式化程序的新手。我有一个指令将对模型的更改进行验证。这样做的一种方法是 $watch 但据我了解,这不是一个好方法,因为它允许更新模型。

所以我在看解析器并尝试了这段代码

app.directive('myDirective', function($compile) {


return {
    restrict: 'E',
    require: 'ngModel',
    scope: {

    },

    link: function($scope, elem, attr, ctrl) {
      console.debug($scope);
      ctrl.$formatters.push(function(value) {
        console.log("hello1");
        return value;
      });
      ctrl.$parsers.unshift(function(value) {

        debugger;
        console.log("hello");
        return value;
      });
    }
  };
});

但是解析器函数永远不会被调用。格式化程序被调用一次。请看plunkr。谁能告诉我我做错了什么,为什么当我在文本框中输入时解析器函数没有被调用?

4

2 回答 2

1

这是一个较晚的响应,但仅供参考:我认为您缺少将调用$parserswhile ui 更改的“胶水”。这应该是这样的:

app.directive('myDirective', function($compile) {

return {
    restrict: 'E',
    require: 'ngModel',
    scope: {

    },

    link: function($scope, elem, attr, ctrl) {
      console.debug($scope);
      ctrl.$formatters.push(function(value) {
        console.log("hello1");
        return value;
      });
      ctrl.$parsers.unshift(function(value) {
        return value;
      });
      scope.$watch('directive model here', function() {
        ctrl.$setViewValue(<build model from view here>);
      });
    }
  };
});

如需完整参考,请参阅(真棒)帖子。

于 2015-07-29T10:23:22.373 回答
0

您的link函数没有被调用,因为关联的 DOM 元素没有改变,只是模型在改变。这有效:

HTML:

This scope value <input ng-model="name" my-directive>

JS:

app.directive('myDirective', function($compile) {
    return {
        require: 'ngModel',
        link: function($scope, elem, attr, ctrl) {
            ctrl.$parsers.unshift(function(value) {
                console.log("hello");
            });
        }
    };
});

有关何时调用该函数的更多信息,请参见此处。link

于 2015-05-06T20:32:11.327 回答