2013-03-09 44 views
8

下面我通過一個屬性過濾確定,但是如何一次過濾另一個屬性?也就是說,不向用戶提供包含不同搜索選項的下拉列表。 示例:我的搜索字詞可能是姓名,電子郵件或年齡。Emberjs:如何一次過濾多個屬性

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

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

上述工作正常更新主列表,但我只能一次過濾一個屬性。

//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中的聯繫人列表並應用一個或多個過濾器,僅返回與該過濾器相對應的模型對象。

小提琴:http://jsfiddle.net/schawaska/ABJN7/

+0

我只是缺少'filter(fn)'。不錯的MWJ。 – KALBB 2013-03-09 18:11:15

+0

我不知道這一點,但'觀察('firstName','lastName')'也適用。 – rxgx 2013-10-02 00:37:08