2014-01-18 5 views
2

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

Я пытаюсь прототипировать пользовательский интерфейс, который существует полностью на стороне клиента. Я использую данные об оборудовании с локальным адаптером хранения. Таким образом, я могу начать с консервированных данных, но я также могу добавить данные и сохранить их в перезагрузках.

Поскольку я сейчас работаю над слоем данных, я построил маршрут settings, который дает мне интерфейс для сброса различных моделей. Я хотел бы добавить выражение Handlebars, например {{modelCount}}, чтобы я мог видеть, сколько записей в нем хранится. Это быстрее, чем использование расширения Ember Data Chrome, которое сбрасывается на вкладку маршрутов на каждой перезагрузке страницы.

Ниже будет показать мне количество записей один раз, но не меняется, когда число записей изменений:

modelCount: function() { 
    var self = this; 
    this.store.find("my_model").then(function(records) { 
     self.set("modelCount", records.get("length")); 
    }); 
}.property() 

Я понимаю, что магазин должен прокси к API в реальном мире, и find возвращает обещание, но это о пределе моих знаний. Я не знаю, как сказать Эмберу, что я хочу знать, сколько записей есть, или если это даже правильный вопрос.

ответ

1

нагрузки результат store.find договора на Ember.ArrayController «ы content, а затем связать длину content к modelCount. Пример:

App.SomeRoute = Ember.Route.extend({ 
    model: function(){ 
    return this.store.find('my_model'); 
    } 
}); 

App.SomeController = Ember.ArrayController.extend({ 
    modelCount: Ember.computed.alias('content.length') 
}); 

См. a working example in http://jsbin.com/iCuzIJE/1/edit.

+0

Можно ли это сделать в произвольной переменной? Я спрашиваю, потому что мой маршрут настроек действует как пользовательский интерфейс, чтобы «перезагрузить» несколько моделей. Так что я действительно хочу, это что-то вроде '{{model1Count}}', '{{model2Count}}', ... (Я согласен, что также возможно, что я пытаюсь сделать что-то очень нежелеющее.) – Ryan

+0

Ember 2.x, 'ArrayControllers' [устарели] (https://emberjs.com/deprecations/v1.x/#toc_arraycontroller). Основные наблюдаемые Ember требуют, чтобы вы реализовали один из своих [классов массива] (https://emberjs.com/api/classes/Ember.Array.html), чтобы ваши шаблоны обновлялись при изменении записей в массиве. – efx

0

Я нашел работоспособное решение, объединив ответ от @panagiotis и аналогичный вопрос, How to load multiple models sequentially in Ember JS route.

В маршрутизаторе, я последовательно загружать свои модели:

model: function() { 
    var self = this; 
    return new Ember.RSVP.Promise(function(resolve, reject) { 
     self.store.find("model1").then(function(model1) { 
      self.store.find("model2").then(function(model2) { 
       self.store.find("model3").then(function(model3) { 
        resolve({ 
         model1: model1, 
         model2: model2, 
         model3: model3 
        }); 
       }); 
      }); 
     }); 
    }); 
}, 

Затем в мой контроллер, я определяю простые вычисляемые свойства:

model1Count: function() { 
    return this.get("model1.length"); 
}.property("model1.length"), 

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