Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RXJS-如果某个可观测值满足特定条件,则执行函数_Javascript_Angular_Reactive Programming_Rxjs - Fatal编程技术网

Javascript RXJS-如果某个可观测值满足特定条件,则执行函数

Javascript RXJS-如果某个可观测值满足特定条件,则执行函数,javascript,angular,reactive-programming,rxjs,Javascript,Angular,Reactive Programming,Rxjs,我已经建立了一个搜索字段与自动完成。我在听一个可观察的东西,它可以检测文本字段的变化 this.term.valueChanges .debounceTime(300) .distinctUntilChanged() .filter(query=>query.toString().length>1) .subscribe(query => { //Execute search function

我已经建立了一个搜索字段与自动完成。我在听一个可观察的东西,它可以检测文本字段的变化

this.term.valueChanges
        .debounceTime(300)
        .distinctUntilChanged()
        .filter(query=>query.toString().length>1)
        .subscribe(query => { 

         //Execute search function and populate dropdown menu

        })

当用户搜索字符串时,下拉式自动完成列表将填充建议。如果用户随后删除搜索字符串,我希望删除下拉列表。如果从可观察流生成的值满足特定条件,是否有RxJS函数可以在订阅之前执行函数

试试这样的方法:

this.term.valueChanges
    .debounce(100)
    .distinctUntilChanged()
    .do(() => /* close list here */)
    .where(val => val.length > 1)
    .select(query => ({ 
        query: query, 
        completions: completions
            .filter(w => w.indexOf(query.toLowerCase()) !== -1)
    }))
    .subscribe(r => {
        /*
         * r.query          contains the current search word
         * r.completions    contain the completions for that word
         */
    });

上使用基本示例尝试以下操作:

this.term.valueChanges
    .debounce(100)
    .distinctUntilChanged()
    .do(() => /* close list here */)
    .where(val => val.length > 1)
    .select(query => ({ 
        query: query, 
        completions: completions
            .filter(w => w.indexOf(query.toLowerCase()) !== -1)
    }))
    .subscribe(r => {
        /*
         * r.query          contains the current search word
         * r.completions    contain the completions for that word
         */
    });

上运行基本示例,您还可以将筛选器移动到订阅中,并在订阅中使用控制流。如果
不止一个字符
执行常规操作,如果没有字符(搜索字符串的擦除),则执行其他操作。看起来是最简单的解决方案,但不是更易于维护的。这是我到目前为止所做的,但我认为使用众多rxjs方法中的一种可能存在一个更优雅的解决方案。不过,你的问题似乎框架不好。订阅只发生一次,搜索字符串的擦除可以发生任意次数。因此,即使存在这样一个Rxjs操作符,它也不会帮助您。最后,您需要的是以可维护的方式将控制流添加到数据流中。以MVI为线索,我将使用一个
事件->意图->动作
数据流,有两个意图:
erasal
更新的搜索
,以及相应的动作:
获取建议
删除下拉列表
,然后订阅它。控制流是通过您使用的运算符内部的正常
if
添加的。您还可以将筛选器移动到订阅中,并在订阅中使用控制流。如果
不止一个字符
执行常规操作,如果没有字符(搜索字符串的擦除),则执行其他操作。看起来是最简单的解决方案,但不是更易于维护的。这是我到目前为止所做的,但我认为使用众多rxjs方法中的一种可能存在一个更优雅的解决方案。不过,你的问题似乎框架不好。订阅只发生一次,搜索字符串的擦除可以发生任意次数。因此,即使存在这样一个Rxjs操作符,它也不会帮助您。最后,您需要的是以可维护的方式将控制流添加到数据流中。以MVI为线索,我将使用一个
事件->意图->动作
数据流,有两个意图:
erasal
更新的搜索
,以及相应的动作:
获取建议
删除下拉列表
,然后订阅它。控制流是通过您使用的运算符内部的正常
if
添加的。