Angularjs Angular指令:未调用ngModelController自定义解析器

Angularjs Angular指令:未调用ngModelController自定义解析器,angularjs,angularjs-directive,angular-ngmodel,angularjs-ng-model,Angularjs,Angularjs Directive,Angular Ngmodel,Angularjs Ng Model,我知道我可以在指令中使用格式化程序和解析器来转换数据,如下所示: //format text going to user (model to view) ngModel.$formatters.push(function(value) { return value.toUpperCase(); }); //format text from the user (view to model) ngModel.$parsers.push(function(value) {

我知道我可以在指令中使用格式化程序和解析器来转换数据,如下所示:

  //format text going to user (model to view)
  ngModel.$formatters.push(function(value) {
    return value.toUpperCase();
  });

  //format text from the user (view to model)
  ngModel.$parsers.push(function(value) {
    return value.toLowerCase();
  });
这里有完整的例子

但当我在指令中使用模板时,我无法让它工作。未调用我的自定义解析器:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.data = { name: ''};
});
app.directive('changecase', function () {
  return {
    restrict: 'E',
    require: 'ngModel',
    scope: { model: '=ngModel' },
    template: '<input type="text" ng-model="model"> {{ model }}',
    link: function (scope, element, attrs, ctrl) {

      //format text going to user (model to view)
      ctrl.$formatters.push(function(value) {
        return value.toUpperCase();
      });

      //format text from the user (view to model)
      ctrl.$parsers.push(function(value) {
        return value.toLowerCase();
      });
    }
  }
});
var-app=angular.module('plunker',[]);
应用程序控制器('MainCtrl',函数($scope){
$scope.data={name:'};
});
应用指令('changecase',函数(){
返回{
限制:'E',
要求:'ngModel',
作用域:{model:'=ngModel'},
模板:“{model}}”,
链接:函数(范围、元素、属性、ctrl){
//格式化发送给用户的文本(要查看的模型)
ctrl.$formatters.push(函数(值){
返回值.toUpperCase();
});
//设置用户文本格式(视图到模型)
ctrl.$parsers.push(函数(值){
返回值。toLowerCase();
});
}
}
});
使用此html:

  <body ng-controller="MainCtrl">
    <changecase ng-model="data.name"></changecase>
    <pre>model is: {{data.name}}</pre>
  </body>

模型为:{data.name}
我猜这要么是范围问题,要么是时间问题,但我无法解决。有人能看出我做错了什么吗


您可以随意在这里摆弄一下Plunker:

您遇到的问题非常简单-在您的示例中,您有两个ng模型,一个在
变更案例中,另一个在
输入中。您将格式化程序添加到第一个,但需要第二个。所以你的指令应该是:

app.directive('realuppercase', function () {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function (scope, element, attrs, ctrl) {
      ctrl.$formatters.push(function(value) {
        return value.toUpperCase();
      });

      ctrl.$parsers.push(function(value) {
        return value.toLowerCase();
      });
    }
  }
});
这是您修改的plunk:
(输入大写->小写的模型)

在一个指令中是否可能有
ngModelController
来自指令输入模板?我做了+1:)您是否询问是否可以从父元素访问ngModelController?在正常情况下,你可以使用一些技巧,但通常不值得。是的,我问你如何从父母那里得到这些,那怎么办?只是出于好奇,我想知道..无论如何谢谢...)@非常感谢你。一个很好的简单答案就是我所追求的,在我的例子中,我希望能够在外部指令中指定ng模型,这样它就不是标准的,所以我改变了我的指令以排除外部指令。
app.directive('realuppercase', function () {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function (scope, element, attrs, ctrl) {
      ctrl.$formatters.push(function(value) {
        return value.toUpperCase();
      });

      ctrl.$parsers.push(function(value) {
        return value.toLowerCase();
      });
    }
  }
});