如何从Angular中的控制器访问$ viewValue

wob*_*col 4 angularjs

我有一个角度应用程序设置如下.Ng-repeat包含li元素,每个元素有2个输入(远远超过2,但对于此演示,我有2个).

该指令设置控制器.

HTML

<li ng-repeat="lw in lw_list"   my-lw   ng-model="lw"  >            
    <input my-cell ng-init="init(lane , $index , 'name')"  ng-class="'lib_name inline_div'" type='text'     value="{{ lw.library.name }}" >
    <input my-cell ng-init="init(lane , $index , 'volume')  "ng-class="'number_field'"      type="number"   ng-model='volume' />    
</li>                       
Run Code Online (Sandbox Code Playgroud)

JavaScript的

angular.module('Demo').directive("myCell",  function(CellStore){
    return {
            controller : 'CellCtrl' , 
        };
}) ;


angular.module('Demo').controller('CellCtrl' , function($scope , CellStore){
    $scope.init = function(lane, row, column){
        $scope.row = row  ;
        $scope.column = column ; 
        console.log("init" ,  $scope.$parent );
        CellStore.addCell(  lane.lane,  row, column , $viewValue ) ; 
    } ; 
}) ; 
Run Code Online (Sandbox Code Playgroud)

因此,我们的想法是,在创建每个输入时,它将调用init函数,该函数将输入值存储在嵌套哈希中(以便稍后检索).但是我不知道如何从控制器中访问$ viewValue变量(输入包含的值).

XML*_*XML 11

其他人已经解决了你的问题,但我没有看到你的主要问题的答案,如果你想这样做,如何从控制器访问$ viewValue.

你真正在做的是访问附加到每个输入的ngModelController实例.如果只是name在表单元素和其中的每个输入上放置一个属性,那么它们的控制器就可以访问了$scope.(因为你正在使用ng-repeat,所以你需要某种动态命名方案,这样你就可以实现它们.你也可以迭代它们.)

一旦你命名了所有东西,获得实例,它只是:

var instance = $scope.formName.inputName;
Run Code Online (Sandbox Code Playgroud)

并且$ viewValue应该是:

instance.$viewValue
Run Code Online (Sandbox Code Playgroud)

一旦你有了这个参考,你也可以使用ngModelController上的其他方法,比如

instance.$setValidity();
Run Code Online (Sandbox Code Playgroud)

编辑:你可以在这个Codepen上玩这个,看看它与一些验证问题的关系.

  • 这是一个很好的答案,应该是所选择的......当你说你正在使用ui.bootstrap的typeahead并且需要创建自定义orderBy或filter函数并且$ modelValue没有同步到$ viewValue时,这就开始了. (2认同)