9

也许这是一个菜鸟错误,但我似乎无法访问$scope.model's$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">
4

1 回答 1

4

我喜欢指令替代方案。本质上,该ui-mask指令并没有做您想做的事情,因此您不妨编写自己的指令。

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

于 2013-06-14T21:26:26.510 回答