2013-08-06 4 views
0

У меня есть модель Phone. Я хочу, чтобы кэшировать все телефоны на моем приложении:Кэширование и ходьба ArrayController

cachePhones : function() { 
    this.set('phones', this.Phone.find()); 
}, 

И получить страны, для которых у меня есть доступные телефоны:

getCountries : function() { 
    var phones = this.get('phones.content'); 
    var countries = new this.dataSet(), country; 
    console.log('phones=%o', phones.length); 
    for (var index = 0, length = phones.length; index < length; index++) { 
     country = phones[index].record.get('country'); 
     console.log('Adding %o', country); 
     countries.add(country, true); 
    } 
    console.log('countries=%o', countries.keys()); 
    return countries.keys(); 
}, 

(dataSet это просто набор реализация в JavaScript)

I я не уверен, что это правильный путь для ходьбы ArrayController:

  • do I действительно нужно получить доступ к content?
  • действительно ли мне нужно получить record?

Это похоже на хакинг вокруг моего пути в внутренних помещениях. Я пробовал до этого:

var phones = this.get('phones'); 
var countries = new this.dataSet(), country; 
for (var index = 0, length = phones.length; index < length; index++) { 
    country = phones[index].country; 
    countries.add(country, true); 
} 

Но он не работал вообще. Каков канонический способ ходьбы ArrayController?

+0

Вы можете использовать Ember.Set.create(); вместо нового this.dataSet() ;. У Ember есть своя реализация Set;) –

+0

Не знаю, спасибо, спасибо! – dangonfast

ответ

2

Вы пробовали что-то вроде этого? Обычно вы всегда должны быть в порядке с использованием функциональных методов Ember для своих коллекций.

var phones = this.get('phones'); 
var countries = new this.dataSet(), country; 
phones.forEach(function(phone, index){ 
    country = phone.get("country"); 
    countries.add(country, true); 
}); 
+0

Выглядит намного чище, чем моя реализация. Я попробую, спасибо. – dangonfast

2

Кроме @mavilein правильный ответ одно стоит отметить, что если у вас есть модель, как App.Phone то после того, как вы App.Phone.find() и записи извлекаются, ваш Store уже имеет кэш, который вы можете проконсультироваться с App.Phone.all() это будет не делайте другого запроса, но вы получаете записи, доступные в Store.

Надеюсь, это поможет.

+0

Имеет смысл, спасибо, я попробую это. – dangonfast

+0

Что делать, если я не знаю, были ли телефоны уже запрошены? Могу ли я получить доступ к 'App.Phone.all()', а 'App.Phone.find()' будет выполняться автоматически? – dangonfast

+0

no. '.all()' только извлекает уже взятые записи, если они есть, см. Здесь: https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/store.js # L848 – intuitivepixel

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