2016-10-11 3 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 getProperties доступен.

Если это не объект Ember, то вы можете использовать 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 для получения данных моделей. Проверьте этот [twiddle] (https://ember-twiddle.com/1065123730e9fe92a61eef81468b405b) для всего соответствующего кода. –

Смежные вопросы