在Angular App中处理过滤值的更优雅方法

梅里克

我在Angular 2应用程序中多次重新加载表格显示中的数据时遇到一些问题。我在考虑的主要问题与以下事实有关:在最初加载组件时,我正在作为网络请求发送一系列过滤器的数据。

基本上,我们利用Mongo / Mongoose功能,该功能使我们可以在发布请求的对象主体中传递键/值对,然后该键/值对将根据传入的值返回经过过滤的数据集。这段代码如下所示:

private processType(name: string, value: any, body)
{
    if (this.body[name] && !value) {
            delete this.body[name];
        } else {
            this.body[name] = { $in: value };
        }
} 

所有这些都按预期工作。但是,在我当前的实现中感觉不太理想的是,在初始组件加载时,我正在传递每个滤波器的所有可能值的数组。用户可以从那里通过UI过滤器列表更改传递和过滤的内容。我将在初始组件加载时传递每个过滤器的可能值的整个数组,因为如果我传递一个空数组,则NOTHING将匹配。但是,似乎应该有更好的方法来处理我的初始请求。

理想情况下,我希望我的初始请求实际上是“不对任何内容进行初始过滤”,而不是像我现在所做的那样“对所有内容进行初始过滤”。我现在已经用这种方式完成了,因为要处理初始加载时的情况以及在用户删除过滤器或所有过滤器的情况下都有些棘手。现在,在任何一种情况下,我都将再次传递所有可能值的数组。我所拥有的作品,但是似乎没有它应该的那么优雅。由于所有这些都作为对象传递到了post请求的主体中,有没有办法我可以删除该对象,而不是传递具有所有值的数组的对象?

这是我其余相关代码的样子:

public initLanguageFilterOptions(): void
{
    this.languageFilterOptions = new FilterOptions([
        { value: 'English', toString: () => 'English' },
        { value: 'Spanish', toString: () => 'Spanish' },
        { value: 'Mandarin', toString: () => 'Mandarin' }
    ]);

    let arr = [];

    // Update array when filter selection is made
    arr.push(this.languageFilterOptions.addEventListener(FilterOptions.CHANGE_EVENT, () => this.sendLangSelections(true)));

    // Update array when filter options are loaded from URL parameters
    arr.push(this.languageFilterOptions.addEventListener(FilterOptions.URL_LOAD_EVENT, () => this.sendLangSelections(true)));

    // Clean up after component is no longer used
    this.addEventListener('ngOnDestroy', function ()
    {
        arr.forEach(s => s()); // Remove all listeners
        return true;
    }.bind(this));

}

/**
* Handles the emitting of the selected values to the API
*/
private sendLangSelections(languageFilterOptions) {
    const origLangArray = ['English', 'Spanish', 'Mandarin'];
    if (languageFilterOptions)
        {
            let selectionsArray = this.languageFilterOptions.selection;
            let values = selectionsArray.map((a) => { return a.value; });
            if (values && values.length > 0)
                {
                    this.sendLanguage.emit(values);
                }
            else if (values && values.length < 1)
                {
                    this.sendLanguage.emit(origLangArray);
                }
        }
}

这是我对Mongo / Mongoose / Node后端的API调用,如下所示:

// A POST request to work with observables
public obsPost(strReq, page, pagesize, body, sort?) {
    const headers = new Headers({ 'Content-Type': 'application/json' });
    const options = new RequestOptions({ headers: this.headers });
    return this.http.post
    (`${API.URL}/${API.VER}${strReq}?apikey=${API.KEY}&page=${page}&pagesize=${pagesize}`,
    body, options)
        .map((res: Response) => res.json())
        .catch(this.filterErrorHandler);
}
    filterErrorHandler(error: Response) {
    console.error(error);
    return Observable.throw(error.json().error || 'Server error');
}
梅里克

为了使这项工作有效,需要在通过传递值时添加更多条件逻辑{ $in: value }由于弹出的错误是由于引起的格式问题{ $in: value },所以关键是确保仅在有要传递的值时才触发此错误。

因此,最后,要使它起作用-不必传递所有可能值的数组,这既不是一种优雅的方法,也不是一种有效的解决方案-我改变了这一点:

private processType(name: string, value: any, body)
{
    if (this.body[name] && !value) {
            delete this.body[name];
        } else {
            this.body[name] = { $in: value };
        }
}

...对此:

private processType(name: string, value: any, body)
{
    if (this.body[name] && !value || this.body[name] && value.length < 1) {
            delete this.body[name];
        } else if (value) {
            this.body[name] = { $in: value };
        }
}

这样做基本上是确保在触发{$ in:value}时,至少有一个值的数组可用。

唯一需要进行的其他更改是涉及当用户取消选择所有值时发出的更改。我这样处理:

private sendLangSelections(languageFilterOptions) {
    const origLangArray = ['English', 'Spanish', 'Mandarin'];
    if (languageFilterOptions)
        {
            let selectionsArray = this.languageFilterOptions.selection;
            let values = selectionsArray.map((a) => { return a.value; });
            if (values && values.length > 0)
                {
                    this.sendLanguage.emit(values);
                }
            else if (values && values.length < 1)
                {
                    this.sendLanguage.emit(this.obj = undefined);
                }
        }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章