民间,
我在表单中有一个文本字段。当用户在此文本字段中输入值时, 我想针对一组值进行检查,以确保该值尚不存在。 我开始写一个指令,因为我是新手,我很安静,
<input type="text" ng-model="user.name" placeholder="Enter Name" required checkDuplicateName existing-names="allUsers" tooltip/>
我上面的代码allUsers看起来像这样
var allUsers = ['john','james','Tim'];
我的指示如下:
angular.module('formInputs').directive('checkDuplicateName', function() {
return {
restrict : 'A',
require : 'ngModel',
link: function(scope, element, attrs, ctrl) {
scope.$watch(attrs.ngModel,function(){
for (var i =0; i<attrs.existing-names.length;i++) {
if (attrs.existing-names[i] === attrs.ngModel) {
attrs.$set('tooltip','Name already exsists');
return;
}
}
});
}
}
});
我遇到的问题是指令没有被解雇。我在这里缺少什么?
答案 0 :(得分:1)
我在这里创建了一个fiddle,其中包含您想法的工作版本。这只是一些小事,看起来你没有正确传递你的数据。当你访问attrs时,它只是给你标记中的字符串,所以attrs.ngModel只会给你“users.name”字符串。
我创建了一个隔离范围,以便您可以看到范围。
scope: {
model: '=ngModel',
users: '=existingNames'
},
此外,角度将这种情况在hs中转换为js中的驼峰情况,例如:thisCaseInHtml
编辑:如果您不想隔离范围,那也没关系。您只需要在范围内评估字符串。
这是一个更新的小提琴http://jsfiddle.net/ddJ4Z/10/。注意如何在范围上评估值。
scope.$watch(attrs.ngModel,function(newVal){
var users = scope.$eval(attrs.existingNames) || [];
for (var i =0; i<users.length;i++) {
if (users[i] === newVal) {
window.alert(newVal);
return;
}
}
});
希望这有帮助!