Javascript 使用控制器中的ngModel setViewValue

Javascript 使用控制器中的ngModel setViewValue,javascript,angularjs,angular-ngmodel,Javascript,Angularjs,Angular Ngmodel,我将一个值数组绑定到多个输入元素。在输入元素上有一些指令,用于设置$parser、$formatters和$validator。控制器不应该关心从viewValue到modelValue的管道 观点: <ul> <li ng-repeat="value in main.values"> <input ng-model="value.v" twice /> {{value.v}} </li> </ul>

我将一个值数组绑定到多个输入元素。在输入元素上有一些指令,用于设置$parser、$formatters和$validator。控制器不应该关心从viewValue到modelValue的管道

观点:

  <ul>
    <li ng-repeat="value in main.values">
      <input ng-model="value.v" twice /> {{value.v}}
    </li>
  </ul>
<ul>
    <li ng-repeat="value in main.values">
      <input ng-model="value.v" twice set-view="value.i"/> {{value.i}}({{value.v}})
    </li>
</ul>    
我想实现一个复制粘贴功能。应该从剪贴板数据中覆盖所有输入元素中的值。因此,控制器实现了一个解析剪贴板数据并为每个输入元素设置值的函数。剪贴板中的值是查看值。由于控制器不知道如何从这些视图值计算模型值,因此必须使用“ngModelController”中的“$parsers”管道。如何实现
MainController.paste()
来设置每个输入元素的视图值

编辑 目前,我通过对list元素的指令解决了实际问题(参见注释)


我找到了两种可能的解决方案(在写问题时:-)

1. 第一种方法实际上不是角度方法,因为控制器必须了解DOM结构。但它是严格的,不需要额外的绑定和手表。要设置视图值,它使用
angular.element.controller()
方法为每个输入元素检索ngModelController

function MainController($scope) {
  this.paste = function() {
    var value = this.pasteValue;
    var inputs = angular.element(document.getElementById('values')).find('input');
    angular.forEach(inputs, function(input) {
      var ngModel = angular.element(input).controller('ngModel');
      ngModel.$setViewValue(value);
      input.value = value;
    });
  };
}
2. 第二种解决方案更倾向于角度方式,使用附加指令对粘贴数据进行处理

function setView() {
  return {
    require: 'ngModel',
    scope: {
      setView : '='
    },
    link: function(scope, elem, attr, ngModel) {
      scope.$watch('setView', function(newValue) {
        if (angular.isDefined(newValue)) {
          elem.val(newValue);
          ngModel.$setViewValue(newValue);
        }
      })
    }

  }  
}

function MainController($scope) {
  this.paste = function() {
    var value = this.pasteValue;
    this.values.forEach(function(v) { v.i = value });
  };
}
观点:

  <ul>
    <li ng-repeat="value in main.values">
      <input ng-model="value.v" twice /> {{value.v}}
    </li>
  </ul>
<ul>
    <li ng-repeat="value in main.values">
      <input ng-model="value.v" twice set-view="value.i"/> {{value.i}}({{value.v}})
    </li>
</ul>    
  • {{value.i}}({{value.v})

实际上,我认为你的方法在概念上是错误的。控制器仅处理模型(即视图模型)值,不应涉及视图值。“视图值”属于视图的关注点(即DOM和指令)。@NewDev没错,但是我应该在哪里实现这样的粘贴功能?关于
ul
元件的指令应该是好地方。类似于“粘贴值”的东西。。。好评论…:)我不完全理解粘贴应该做什么?这是否模拟用户的复制粘贴?如果是这样,则接受粘贴值的控件在控制器获得粘贴值之前会进行自己的转换(即
两次
)。考虑它的另一种方式是忘记DOM/View/Directions,只实现控制器(即应用程序的逻辑)——控制器应该知道什么?如果有
pasteHalfValue()
?@NewDev的概念,实际功能是将CSV数据粘贴到输入元素表中。每个输入元素都可以接收粘贴事件,这无关紧要。控制器(或指令)必须解析CSV数据并填充表格。从您的第一条评论中,我得到了一个新的想法,即在table元素上实现一个指令,该指令侦听
粘贴
,而不是在控制器中编写处理程序。