Angular JS Karma Testing'undefined'不是一个函数(评估'ngModel。$ setViewValue(undefined)')

时间:2014-09-19 00:07:28

标签: angularjs angularjs-directive karma-runner karma-jasmine

我正在尝试测试一个指令而且我一直在努力  TypeError:' undefined'不是一个函数(评估' ngModel。$ setViewValue(undefined)')

我做错了什么?

该指令旨在清除隐藏的细节:

testApp.directive("clearhidden", [ '$compile', '$parse', function ($compile, $parse) {
return {
    restrict: "A",
    scope:true,
    require: ['ngModel'],
    link: function(scope, tElement, attrs, ngModel) {

            if(!ngModel){
                return;
            }
            //clear model values for hidden fields
            var initValue = undefined;
            if (attrs.ngInit) {
                 initValue = $parse(attrs.ngInit)(scope);                    
            }
            scope.$watch(function() {                   
                return tElement.is(":visible");
            }, function(visible) {
                 if (visible) {
                    if (ngModel.$modelValue == undefined) {
                         if (initValue != undefined) {
                             ngModel.$setViewValue(initValue);
                             ngModel.$render();
                         }
                     }
                 } else {
                    var isDisabled = false;                        
                    if (attrs.ngDisabled) {
                         isDisabled = $parse(attrs.ngDisabled)(scope);
                    }
                    if (!isDisabled) {                          
                        ngModel.$setViewValue(undefined);
                        ngModel.$render();
                    }
                 }
            });
    }
};
}]);

正在执行的业力是:

   describe("directive-ClearHidden", function() {               
    var $compile;
    var $rootScope;     
    beforeEach(module('testApp'));
    beforeEach(inject(function(_$compile_, _$rootScope_){
      $compile = _$compile_;
      $rootScope = _$rootScope_;
    }));

   it('process directive', function() {
       $rootScope.myObject="TESTER2";          
       var element = $compile(angular.element('<form name="form"><input ng-  model="myObject" clearhidden/></form>'))($rootScope);        
       $rootScope.$digest();           
     });
  });

你能否告诉我为什么我在ngModel上收到错误。$ setViewValue(undefined); ?

由于

1 个答案:

答案 0 :(得分:1)

在您的指令中,您需要: -

link: function(scope, tElement, attrs, ctrls) {
      var ngModel = ctrls[0]; //<-- Get ngModelController from array of controller(s)

由于您已将ngModel指定为必需数组,require: ['ngModel'],链接函数的控制器参数实际上将是一个控制器数组(在您的情况下仅为ngModelController),而不仅仅是ngModel或者您可以将其更改为require:'ngModel'

来自文档

  

当指令需要控制器时,它接收该控制器作为其链接函数的第四个参数。利用这一点,myPane可以调用myTabs的addPane函数。

     

如果需要多个控制器,则指令的require选项可以采用数组参数。发送到链接功能的相应参数也是一个数组。

Plnkr with Array of controllers

Plnkr w/o array of controllers