背景

我正在编写一些功能测试,以测试路由器是否可以正确导航和加载模型。到目前为止,还算不错-即使考虑到这个问题。

我创建了a fiddle,供您使用。它行不通-尽管 fork @wagenet,但我对jsfiddle和ember从未有过多少运气。但是它具有更多的源代码,可以帮助您全面了解我所发生的事情。

我最大的提示

因此,我最大的提示是,以下代码无法从 Controller 中检索具有已知ID的元素:

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

我在setupController Hook 中完成了类似的操作,并且正常工作。但这是在我的应用程序上下文中,因此看起来更像这样:
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;
    }
});

这显然不是那么干净。

所以,问题
  • .findBy()损坏了吗?
  • 我的.findBy()做错了吗?
  • 您如何使用.findBy()
  • 最佳答案

    findBy带有2个参数,要测试的属性键和要查找的值(如果未传入,则默认为true)。本质上,您正在搜索具有TYPE1属性true的模型

    您可能正在寻找这样做

    findBy("id", "TYPE1")
    

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

    09-21 00:03