我正在尝试测试一个指令而且我一直在努力 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); ?
由于
答案 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选项可以采用数组参数。发送到链接功能的相应参数也是一个数组。