自定义过滤器是否应修改/更新其输入?

时间:2017-04-17 08:08:32

标签: angularjs angular1.6

说我有这样的自定义过滤器:

    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

2 个答案:

答案 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设置为结果。

我认为不应该做的唯一事情就是将原始值设置为过滤后的值,因为那样你基本上就会丢失所有数据!最重要的是,你可以为自己设置一个(无限的)摘要循环。