2013-03-09 8 views
8

以下単一のプロパティでフィルタリングしますが、別のものでフィルタリングするにはどうすればよいですか?すなわち、異なる検索オプションを含むドロップダウンをユーザに提供することなく、 の例:私の検索用語は、名前、電子メール、または年齢とすることができる。Emberjs:一度に複数のプロパティでフィルタリングする方法

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'), 
}) 

一つの考えフィルタはlength = 0を生じ、一部がどのような結果をマージする場合は、再度、フィルタを再することです。しかし、私はその考え方では大きくはないし、Emberがこれを達成するためにより良い、よりエレガントな方法を持っていると信じている。

答えて

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; 
    }); 
}, 
... 

このcontentの連絡先リストを繰り返し処理し、1つまたは複数のフィルタを適用し、フィルタに対応するモデルオブジェクトのみを返します。

Fiddle:http://jsfiddle.net/schawaska/ABJN7/

+0

私はちょうど 'filter(fn)'がありませんでした。ニースのMWJ。 – KALBB

+0

私はこれを知らなかったが、 'observe( 'firstName'、 'lastName')'も働いていた。 – rxgx

関連する問題