在这里摆弄:http://jsfiddle.net/graphicsxp/QA4Fa/2/
我正在试图创建一个搜索指令。基本上它只是一个检测用户输入的文本框,在1秒延迟后,会调用一个搜索方法。
它还没有工作,我有两个问题。
首先,当用户输入文本时,为什么filterCriteria没有更新?
其次,filterCriteria上的监视是在页面加载时触发的,而不是在文本框中输入文本时触发的。
<div ng-app="myApp" ng-controller="myController">
<delayed-search ng-model="filterCriteria"></delayed-search>
<span>filter criteria is : {{filterCriteria}}</span>
</div>
angular.module('myApp', []).directive("delayedSearch", ['$timeout', function($timeout) {
return {
restrict: "E",
template: '<input type="text" />',
scope: {
filterCriteria : '='
},
link: function (scope, element, attrs) {
},
controller: function ($scope) {
var timer = false;
$scope.$watch('filterCriteria', function () {
if (timer) {
$timeout.cancel(timer);
}
timer = $timeout(function () {
alert('timeout expired');
}, 1000)
});
}
}
}]).controller('myController', function($scope){ });
答案 0 :(得分:3)
You should NOT use a controller with a directive ( until you understand it ! ) .
指令中的控制器用于指令通信的指令(我希望他们将其命名为其他内容!)。
@Langdon做对了..但这是另一个相同的实现。请注意,在答案中都缺少控制器。
答案 1 :(得分:2)
首先,当用户输入文本时,为什么filterCriteria没有更新?
您的范围错误,应为scope: { ngModel : '=' },
,您的模板应为template: '<input type="text" ng-model="ngModel" />
。
其次,filterCriteria上的监视是在页面加载时触发的,而不是在文本框中输入文本时触发的。
与第一个问题相同,您应该关注ngModel
。
此外,您不需要控制器的开销,只需使用链接功能就可以逃脱。这是一个更新的小提琴:http://jsfiddle.net/QA4Fa/3/