如何在没有表单且没有指令的情况下从Controller内部访问$ ngModelController

时间:2013-06-14 20:25:25

标签: angularjs angularjs-scope angularjs-controller

也许这是一个新手的错误,但我似乎无法访问$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">

1 个答案:

答案 0 :(得分:4)

我喜欢指令选择。基本上ui-mask指令没有做你想要的,所以你也可以编写自己的指令。

您不必将inicio传递给view-value指令。而是将您自己的解析器添加到ngModelCtrl.$parsers。这是一个例子:https://stackoverflow.com/a/15556249/215945