我正在编写一些功能测试来测试我的路由器正在导航并正确加载我的模型.到目前为止,这很好 - 即使是在这个问题上.
为了你的享受,我创造了一个小提琴.这是行不通的-我从来没有多少运气用的jsfiddle和灰烬,尽管分叉的@wagenet.但是它有更多的源代码来帮助我全面了解我的情况.
所以我最大的抱怨是以下代码无法从控制器检索具有已知id的元素:
var controller = App.__container__.lookup("controller:postsNew");
var type1Option = controller.get("controllers.types").findBy("TYPE1");
Run Code Online (Sandbox Code Playgroud)
我在setupController钩子里做了类似的事情并且它有效.但这是在我的应用程序的上下文中,所以看起来更像是这样:
setupController: function(controller, model) {
this._super(controller, model);
this.controllerFor("types").findBy("TYPE1");
}
Run Code Online (Sandbox Code Playgroud)
但即使这样也不行了!我现在也在我的应用程序之外工作 - 在一个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;
}
});
Run Code Online (Sandbox Code Playgroud)
这显然不是那么干净.
.findBy()打破?.findBy()了吗?.findBy()?