2015-03-26 3 views
3

Моя цель - передать фильтрованные данные на мой контроллер, а затем в мой шаблон. Я пробовал не использовать фильтр, и все работает так, как ожидалось. Если я даже попытаюсь использовать фильтр, который пропускает все, я не получаю никаких данных. Я даже попробовал использовать false вместо true и возиться с списком аргументов фильтра.Проблемы с маршрутом Ember.js с фильтром

Я использую светильники с данными ember-data, чтобы проверить это. Я следую соглашениям с названиями, поэтому большая часть работы выполняется для меня под капотом. Кажется, что все работает, хотя (в противном случае первый пример также должен иметь проблему).

Works (поступает в контроллер и в конечном счете визуализируется на странице):

App.DomainDirRoute = Ember.Route.extend({ 
    model: function(params) { 
    return this.store.find('domain_dir'); 
    } 
}); 

Сбой (контроллер получает пустой массив):

App.DomainDirRoute = Ember.Route.extend({ 
    model: function(params) { 
    return this.store.filter('domain_dir', function(item){ 
     return true; 
    }); 
    } 
}); 

UPDATE (ПОПЫТКА 1):

Хорошо, поэтому я попробовал пару вещей, основанных на ответе Сэма Селикова. Я определил 4 свойства (2 фильтра, одну карту, одну обычную копию) в контроллере и попытался отобразить их на макетной странице. Результатом является только свойство copyDomain.

Свойства в контроллере:

filteredDomains: Ember.computed.filterBy('domain', 'domain', true), 
upperCaseDomains: Ember.computed.map('domain', function(domain, index) { 
    return domain.toUpperCase() + '!'; 
    }), 
filteredDomains2: function() { 
    return this.get("model").filterBy('domain', true); 
    }.property('[email protected]'), 
copyDomains: function(){ 
    result = []; 
    this.forEach(function(item) { 
     result.pushObject(item); 
    }) 
    console.log(result); 
    return result; 
}.property('[email protected]') 

Mockup:

 <ul> 
      <li>filteredDomains</li> 
     {{#each domainDir in controller.filteredDomains}} 
      <li>domainDir.domain</li> 
     {{/each}} 
     </ul> 
     <ul> 
      <li>filteredDomains2</li> 
     {{#each domainDir in controller.filteredDomains2}} 
      <li>domainDir.domain</li> 
     {{/each}} 
     </ul> 
     <ul> 
      <li>upperCaseDomains</li> 
     {{#each domainDir in controller.upperCaseDomains}} 
      <li>domainDir.domain</li> 
     {{/each}} 
     </ul> 
     <ul> 
      <li>copyDomains</li> 
     {{#each domainDir in controller.copyDomains}} 
      <li>domainDir.domain</li> 
     {{/each}} 
     </ul> 

ответ

1

Фильтрация обычно осуществляется на уровне контроллера/компонента. store.find выполняет запрос AJAX. Ваша цель только получить отфильтрованное подмножество данных с сервера или отфильтровать данные, которые у вас уже есть на уровне представления?

Обычно, если вы просто хотите провести фильтрацию в реальном времени, вы сделаете это в контроллере. Оставьте свой модельный крюк, как this.store.find('domain_dir') и добавить фильтр в контроллере:

App.DomainDirController = Ember.Controller.extend({ 
    filteredDomains: function() { 
    return this.get("model").filterBy('someProp', true); 
    }.property('[email protected]') 
}); 

Вы должны также проверить computed macros для некоторого сокращения от:

App.DomainDirController = Ember.Controller.extend({ 
    filteredDomains: Ember.computed.filterBy('model', 'someProp'); 
}); 

Теперь в шаблоне, вы можете сделать

{{#each domain in filteredDomains}} 
    ... 
+0

Я действительно не знал, где разместить фильтрацию, поэтому ваш совет по размещению очень ценится. Я пробовал ваши решения, но у меня все еще возникают проблемы. Я обновил свой вопрос с помощью подходов, которые я пробовал, и их результатов. На данный момент я могу обойти проблему с измененной версией свойства copyDomains (пройти через все), но я предпочел бы использовать способ Ember. – HSquirrel

+0

Это решение сработало для меня, но я действительно озадачен, почему это происходит в первую очередь. Я думал, что 'Ember.Route # model' будет работать с любыми обещаниями ... – valo

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