2

Я пытаюсь проверить директиву, и я продолжаю получать 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 (не определено). ; ?

Благодаря

+0

Покажите вашу карму конфигурации тоже, пожалуйста. – alecxe

+1

Я сомневаюсь, что это имеет какое-то отношение к конфигурации кармы. – PSL

ответ

1

В вашей директиве вам нужно сделать: -

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

Поскольку вы определили ngModel как необходимый массив, require: ['ngModel'], контроллер аргумент функции связующей будет массив контроллера (s) (В вашем случае только ngModelController), а не только ngModel, или вы можете изменить его на require:'ngModel'.

Из документации

When a directive requires a controller, it receives that controller as the fourth argument of its link function. Taking advantage of this, myPane can call the addPane function of myTabs.

If multiple controllers are required, the require option of the directive can take an array argument. The corresponding parameter being sent to the link function will also be an array.

Plnkr with Array of controllers

Plnkr w/o array of controllers

+0

Спасибо, много! Это исправило это. – user1388368

+0

@ user1388368 Добро пожаловать .. :) – PSL

 Смежные вопросы

  • Нет связанных вопросов^_^