使用{{linkTo}}时是否有任何理由不调用setupController?我的应用程序中有两个实例正在使用linkTo,在第二种情况下。它不起作用。我能看到的唯一区别是,在第一种情况下,linkTo正在循环中使用,而在第二种情况下,它不是。以下是非工作的相关代码:
App.Router.map(function() {
this.resource("search", { path: "/search/:args" });
});
App.SearchCriteria = Ember.Object.extend({ });
App.SearchRoute = Ember.Route.extend({
serialize: function(model, params) {
// .. some code that converts model to a string called args
return {'args': args}
},
model: function(params) {
// convert args, which is query string-formatted, to an object
// and then make a App.SearchCriteria object out of it.
return App.SearchCriteria.create($.deparam(params.args));
},
setupController: function(controller, model) {
controller.set("searchCriteria", model);
}
});
在搜索模板中:
{{view Ember.Checkbox checkedBinding="searchCriteria.music"}} Music
{{#linkTo search searchCriteria}}Search{{/linkTo}}
我在日志中看到的最后一件事是:
Transitioned into 'search'
通常,我会看到setupController在某个时刻被调用,但它没有发生或某些原因。我甚至尝试使用{{action}}方法调用处理程序然后使用transtionTo,但结果相同。
更新1:添加更多详情
工作和非工作案例之间的唯一区别是,在工作案例中,{{linkTo}}是从与控制器和路由器相同的模板调用的(即,linkTo在搜索中)模板,它正在调用SearchRoute)。在工作的情况下,linkTo是在SearchRoute上调用的,但是来自属于不同路由器的不同模板。)
在对Ember代码进行一些Chrome调试后,我发现未调用路由器是因为partitioned.entered
为空。在工作案例中,它是非空的。
var aborted = false;
eachHandler(partition.entered, function(handler, context) {
if (aborted) { return; }
if (handler.enter) { handler.enter(); }
setContext(handler, context);
if (handler.setup) {
if (false === handler.setup(context)) {
aborted = true;
}
}
});
更新2:找到根问题 - 错误?
我想我理解为什么处理程序没有被触发的根本原因,我认为这是因为partitionHandlers(oldHandlers, newHandlers)
方法不认为模型已经改变,因此不会触发处理程序。
具体而言,这是该观点的相关部分:
{{view Ember.Checkbox checkedBinding="searchCriteria.music"}} Music
{{#linkTo search searchCriteria}}Search{{/linkTo}}
虽然用户勾选了复选框(从而改变了searchCriteria
的状态),但Ember并不认为searchCriteria
有任何不同,因此没有做任何事情。
这是一个错误吗?
答案 0 :(得分:1)
我不确定你的问题是什么,但这可能有所帮助。
每次输入路线时都会调用 setupController
。但是每次都不能调用model
钩子。
请参阅Ember指南:http://emberjs.com/guides/routing/specifying-a-routes-model/
注意:具有动态段的路径只有在通过URL输入时才会调用其模型钩子。如果通过转换输入路线(例如,当使用链接到Handlebars帮助器时),则已经提供了模型上下文并且不执行钩子。没有动态段的路由将始终执行模型挂钩。
一般来说,如果单击link-to
生成的链接进入路线,Ember将不会为该路线调用model
挂钩。相反,它将模型(link-to
参数)传递给该路线。
这里的理念是,因为客户端已经具有模型上下文,Ember认为没有必要从服务器再次获取它(model
挂钩的工作。)