使用 {{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)。在工作情况下,正在 SearchRoute 上调用 linkTo,但来自属于不同路由器的不同模板)。
在对 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
并没有什么不同,因此什么也不做。
这是一个错误吗?