我不完全确定这是最好的解决方案,但这是我会为这样的事情做的:http: //jsfiddle.net/DotDotDot/K2S4v/
正如你所想,我做了一个有点复杂的指令,所以我会在这里解释一下:
该指令的结构类似于:
- 在参数中传递要比较的单词列表
- 向模板添加输入字段
- 听这个领域的修改
- 检查生词,并计算匹配词的数量
显示和类似的东西
.directive('validate', function(){
return {
restrict:'A',
template:see below,
replace:false,
示例的模板看起来像这样,但实际上它可能是空的,使用它来显示要容易得多
<p><span ng-bind-html-unsafe="theDisplayedText"></span><br/>{{count}} words corresponding</p>
然后,重要的部分,我使用了 compile 函数,添加输入字段,然后在 postLink 函数中指定行为
添加字段(这也可以直接在模板中完成,不是重点)
compile:function(elt,attr){
var inp=new angular.element('<input>')
inp.attr('type','text')
inp.attr('ng-model','theText');
inp.attr('ng-change','changed()');
elt.append(inp)
然后指定指令如何反应,链接函数:
return {
pre: function preLink(scope, iElement, iAttrs, controller) {
},
post: function postLink(scope, iElement, iAttrs, controller) {
scope.count=0;
var copyOfWords= new Array(iAttrs['list'])//the list to compare with
scope.changed=function(){
var alreadyIn=Array();
scope.theDisplayedText=angular.copy(scope.theText);
var sliced=scope.theText.split(" ");//we get each word
scope.count=0
for(var i=0;i<sliced.length;i++){
if(sliced[i].length>3 && copyOfWords.indexOf(sliced[i])!=-1 && alreadyIn.indexOf(sliced[i])==-1)//the word exists and isn't counted yet
{
scope.count+=1//incrementing the counter
alreadyIn.push(sliced[i])//avoiding doubles
sliced[i]="<span class='hi'>"+sliced[i]+"</span>"//display in red
}
}
scope.theDisplayedText=sliced.join(" ");
}
}
}
该功能非常幼稚且没有真正优化,这可能是您必须更改的部分,但它适用于示例。这很简单,您将整个文本拆分为单词,然后将它们与参数中的单词列表进行比较。它有一些问题(似乎indexOf()
在字符串数组上也为每个子字符串返回一个结果,因此如果您开始输入一个单词,它将被计算在内)但这仅用于示例,在您的应用程序中,您可能必须表现得更好检查,或任何你想要的(这是你的应用程序:))
我希望这对您的申请有所帮助,如果您对指令有一些问题,本网站有很多信息:http: //amitgharat.wordpress.com/2013/06/08/the-hitchhikers-guide-to-指令/
玩得开心 =)