如何在没有表单和指令的情况下从控制器内部访问$ngModelController



也许这是一个新手错误,但我似乎无法访问$scope.model$ngModelController,所以我可以从中抓取$viewValue

我有一个没有表单的输入(我使用ui-mask指令):

<input type="text" ng-model="inicio" name="inicio" ui-mask="99/99/9999">
// inside my controller
$scope.inicio = dateFilter((new Date).getTime(), 'dd/MM/yyyy');

ui-mask将$modelValue设置为与$viewValue不同的值,这使得向服务器发送格式化数据变得困难。当$scope.inicio模型发生变化时,该值是一个没有斜杠的日期,如01012014。所以我需要能够获得该输入的控制器,但不必将其包装在表单中,并且必须使用$scope.myForm.inicio.$viewValue

我知道我能做的事情,但看起来很粗糙,一定有更简单的方法:

  • 将元素放入表单中并通过$scope.myForm.input.$viewValue
  • 访问它
  • 使用jQuery $('input[name="inicio"]').data('$ngModelController');获取元素数据
  • 使用angular.element('input[name="inicio"]').controller('ngModel');
  • 获取元素
  • 创建一个指令,把它放在输入中,用它来更新我的作用域模型
app.directive('viewValue', function(){
  return {
    priority: 10,
    require: 'ngModel',
    link: function(scope, element, attrs, controller){
      scope.$watch(attrs.viewValue, function(newValue, oldValue){
        if (newValue !== oldValue){
          scope[attrs.viewValue] = controller.$viewValue;
        }
      });
    }
  }
});
<input type="text" ui-mask="99/99/9999" ng-model="inicio" view-value="inicio">

我喜欢指令替代。本质上,ui-mask指令不是做你想要的,所以你不妨写你自己的指令。

你不应该把inicio传递给view-value指令。相反,将您自己的解析器添加到ngModelCtrl.$parsers。下面是一个例子:https://stackoverflow.com/a/15556249/215945

相关内容

最新更新