2016-10-11 55 views
0

我想通过Ember.js中的输入字段过滤模型的所有属性。如果在其中一个模型属性中找到文本字段输入,我想返回过滤结果。Ember.js - 过滤模型的所有属性

我已经有一个工作解决方案,但我想知道是否有更好的方法来过滤所有属性,而不是一个接一个地获取它们。我已经做了很多研究,但是我找不到解决这个问题的更好方法。下面是相关代码:

型号

[ 
    { 
    "source": "this is a source", 
    "title": "this is a title", 
    "message":"this is a message" 
    }, 
    { 
    "source": "this is a source too", 
    "title": "this is a title too", 
    "message":"this is a message too" 
    } 
] 

过滤

export default Ember.Component.extend({ 

    filterText: "", //Input field value 

    filteredArticles: Ember.computed('filterText', function() { 
    var filter = this.get('filterText').toLowerCase(); 
    return this.get('model').filter(function (item) { 
     return item.get('title').toLowerCase().indexOf(filter) !== -1 || 
     item.get('message').toLowerCase().indexOf(filter) !== -1 || 
     item.get('source').toLowerCase().indexOf(filter) !== -1 
    }); 
    }) 
}); 

那么,有没有一种方法用一个命令(例如像项目获得所有属性。 get('allProperties'))?

回答

4

在所有Ember Object getProperties方法可用。

如果不是灰烬对象,那么你可以使用Ember.getProperties

但同样这些方法返回的对象有指定的属性,而不是单独的值,您正在寻找。所以你的方法是正确的,只有当你在处理model对象中的两个或三个属性。如果你认为你会得到更多的属性或动态的,你会添加更多的属性模型对象,那么你可以在filter回调内做对象迭代。

filterdText: Ember.computed('filterText',function(){ 
    var filter = this.get('filterText').toLowerCase(); 
    return this.get('model').filter((item,index) =>{ 
     for(var key in item){ 
     if(item.hasOwnProperty(key)){ 
      if(item[key].toLowerCase().indexOf(filter) !== -1){ 
      return true 
      } 
     } 
     } 
     return false; 
    })  
    }) 
+0

感谢您的详细解答。不知何故,你的建议解决方案不适合我。在_hasOwnProperty_检查之前,关键变量不仅包含模型属性,还包含诸如“__debugInfo_”或“__internalModel_”之类的属性。在_hasOwnProperty_检查之后,该键甚至不包含模型属性。我没有用控制台日志检查它。有任何想法吗? –

+0

检查此[twiddle](https://ember-twiddle.com/66477278e5e06bf328dd7aaaa8cc7bb6?openFiles=routes.application.js%2C)..可能是您可以发布路线模型挂钩。 – kumkanillam

+0

我再次尝试使用您的代码,但这次密钥只包含属性“store”。我正在使用Ember Data存储来检索模型数据。查看此[twiddle](https://ember-twiddle.com/1065123730e9fe92a61eef81468b405b)以获取所有相关代码。 –