说我有这样的自定义过滤器:
WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = Paths.get("/home/user/test/");
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
System.out.println("Begin monitor to test folder: ");
for (;;) {
// wait for key to be signaled
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}
for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
// The filename is the
// context of the event.
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>)event;
Path filename = ev.context();
if (filename.toString().startsWith(".")) continue;
if (kind == OVERFLOW) {
continue;
} else if (kind == ENTRY_CREATE) {
System.out.println(kind.name() + ":" +filename);
} else if (kind == ENTRY_DELETE) {
System.out.println(kind.name() + ":" +filename);
} else if (kind == ENTRY_MODIFY) {
System.out.println(kind.name() + ":" +filename);
}
}
boolean valid = key.reset();
if (!valid) {
break;
}
}
这是HTML,它适用于过滤器:
app.filter('custom', function () {
return function (input, search) {
const ret = {};
// find matches in input, given search
ret[key] = input[key] // etc etc
return ret;
});
我认为我需要做的是,在控制器中将 <div class="row" ng-repeat="(promptId, q) in myHash | custom:searchText">
设置为自定义过滤器的myHash
值?
这是正确的做法,如果是的话,我该怎么做?
换句话说,我应该这样做:
ret
答案 0 :(得分:1)
“[我认为我需要做什么],是否将控制器中的
myHash
设置为自定义过滤器的ret
值?”
不,那是错的。过滤器不应修改其输入。它应该产生一个从输入派生的新值(即它的函数参数)。
来自AngularJS documentation on filters(我强调):
“过滤器功能应该是pure function ,这意味着它应该始终在给定相同输入参数的情况下返回相同的结果,并且不应该影响外部状态。”
据我所知,您已经采用了正确的方式(在您的第一个代码示例中)。
答案 1 :(得分:0)
令人惊讶的是,以下工作。
之前:
<div class="row" ng-repeat="(promptId, q) in myHash | custom:searchText">
后:
<div class="row" ng-repeat="(promptId, q) in (myFilteredHash = (myHash | custom:searchText))">
所以现在,我的控制器的$ scope中有第二个变量名为myFilteredHash
。
您可以将$ scope传递给过滤器,然后将myFilteredHash
设置为结果。
我认为不应该做的唯一事情就是将原始值设置为过滤后的值,因为那样你基本上就会丢失所有数据!最重要的是,你可以为自己设置一个(无限的)摘要循环。