С помощью.findBy () c контроллером массива, заполненного данными Ember

фон

я пишу некоторые функциональные тесты, чтобы проверить, что мой маршрутизатор правильно перемещается и загружает мои модели. Пока все идет хорошо-даже в свете этого вопроса.

я создал скрипка, для вашего удовольствия. Это не работает-мне никогда не везло с jsfiddle и ember, несмотря на раздвоение @wagenet. Но у него больше исходного кода, чтобы помочь получить общую картину того, что у меня происходит.

мой Самый Большой Gripe

поэтому моя самая большая проблема заключается в том, что следующий код не работает для извлечения элемента с известным идентификатором из контроллера:

var controller = App.__container__.lookup("controller:postsNew");
var type1Option = controller.get("controllers.types").findBy("TYPE1");

я сделал что-то подобное в крюке setupController, и это сработало. Но это было в контексте моего приложения, поэтому оно выглядело скорее так:

setupController: function(controller, model) {
    this._super(controller, model);
    this.controllerFor("types").findBy("TYPE1");
}

но даже это больше не работает! Я также работаю вне моего приложения, сейчас-в тесте qunit. Поэтому я должен использовать App.__container__.lookup(), согласно все, что я читал.

Корень?

что я нашел это controller.length не определено--что вызывает .findBy() на провал. И элементы существуют в массиве...по крайней мере, я могу их видеть, делая controller.toArray().

Временное Разрешение

следующее, что я должен сделать вместо этого:

var controller = App.__container__.lookup("controller:postsNew");
var type1Option = null;
$.each(controller.get("controllers.types").toArray(), function(index, elm) {
    if (elm.get("id") === "TYPE1") {
        type1Option = elm;
        return true;
    }
});

это, очевидно, не так чист.

Итак, Вопросы

  • Is .findBy() сломана?
  • я делаю .findBy() не так?
  • как вы используете .findBy()??

1 ответов


findBy принимает 2 аргумента, ключ свойства для проверки и значение для поиска (по умолчанию true, если не передано). По сути, вы ищете модель со свойством TYPE1 это true

вы, вероятно, хотите сделать это

findBy("id", "TYPE1")

http://emberjs.com/api/classes/Ember.Array.html#method_findBy

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