背景
我正在编写一些功能测试,以测试路由器是否可以正确导航和加载模型。到目前为止,还算不错-即使考虑到这个问题。
我创建了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