一尘不染

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

angularjs

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

阅读 222

收藏
2020-07-04

共1个答案

一尘不染

我喜欢指令替代。本质上,该ui-mask指令没有执行您想要的操作,因此您最好编写自己的指令。

您不必传递inicioview-value指令。而是将您自己的解析器添加到中ngModelCtrl.$parsers

2020-07-04