8

以下では確かに単一のプロパティでフィルタリングしていますが、別のプロパティで一度にフィルタリングするにはどうすればよいですか? つまり、さまざまな検索オプションを含むドロップダウンをユーザーに提供することはあり ません。

var search = this.controllerFor('employees').search; //can be name, email or age

employees = this.get('currentModel').filterProperty('name', search);

上記はマスター リストの更新には問題なく機能しますが、一度に 1 つのプロパティでしかフィルタリングできません。

//Sample Model
App.Employee = DS.Model.extend({
    email: DS.attr('string'),
    name: DS.attr('string'),
    age: DS.attr('number'),
})

1 つの考えとしては、フィルターの結果が得られた場合に再度フィルターをかけ直しlength = 0、何らかの方法で結果をマージすることです。しかし、私はその考えにあまり賛成ではなく、Ember にはこれを実現するためのより優れた、より洗練された方法があると信じています。

4

1 に答える 1

8

このfilter関数を使用して、モデル内の複数のプロパティをフィルター処理したり、コントローラーから他のプロパティを使用したりすることもできます。例えば:

次のようなモデルを想像してください。

App.Person = DS.Model.extend({
    firstName: DS.attr('string'),
    lastName: DS.attr('string'),
    fullName: function() {
        return '%@ %@'.fmt(
            this.get('firstName'),
            this.get('lastName')
        );
    }.property('firstName', 'lastName')
});

複数のプロパティでフィルタリングするには、次のような検索機能を備えたコントローラーがあるとします。

...
performSearch: function(searchTerm) {
    return this.get('content').filter(function(person) {
        return person.get('firstName').indexOf(searchTerm) !== -1 ||
               person.get('lastName').indexOf(searchTerm) !== -1;
    });
},
...

これにより、連絡先のリストが反復処理され、content1 つ以上のフィルターが適用され、フィルターに対応するモデル オブジェクトのみが返されます。

フィドル: http://jsfiddle.net/schawaska/ABJN7/

于 2013-03-09T17:30:27.100 に答える