Javascript 使用{{linkTo}或TransionTo(“路径”,模型)时未调用setupController;

Javascript 使用{{linkTo}或TransionTo(“路径”,模型)时未调用setupController;,javascript,ember.js,javascript-framework,Javascript,Ember.js,Javascript Framework,使用{{linkTo}时,是否有任何原因无法调用setupController?在我的应用程序中,有两个实例使用了linkTo,第二个实例使用了linkTo。它不起作用。我能看到的唯一区别是,在第一种情况下,linkTo在循环中使用,而在第二种情况下则没有。以下是非工作设备的相关代码: App.Router.map(function() { this.resource("search", { path: "/search/:args" }); }); App.SearchCriteri

使用{{linkTo}时,是否有任何原因无法调用setupController?在我的应用程序中,有两个实例使用了linkTo,第二个实例使用了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}}方法调用处理程序,然后使用TransionTo,但结果相同

更新1:添加更多详细信息

工作和非工作情况之间的唯一区别是,在工作情况下,{{linkTo}}是从与控制器和路由器相同的模板调用的(即,linkTo在搜索模板中,它调用SearchRoute)。在这种情况下,在SearchRoute上调用linkTo,但来自属于不同路由器的不同模板)

在对Ember代码进行Chrome调试后,我发现路由器没有被调用是因为
已分区。输入的
为空。在工作情况下,它是非空的

  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
没有任何不同,因此什么也不做


这是一个错误吗?

我不确定您的问题是什么,但这可能会有所帮助

setupController
在每次输入路线时都被调用。但是,
model
hook可能不会每次都被调用

参见《灰烬指南》:

注意:带有动态段的路由只有在通过URL输入时才会调用其模型挂钩。如果路线是通过转换输入的(例如,使用“链接到把手”辅助对象时),则已提供模型上下文,并且不会执行挂钩。没有动态线段的管线将始终执行模型挂钩

一般来说,如果您单击
链接到
生成的链接进入该路线,Ember将不会调用该路线的
模型
挂钩。相反,它将模型(
链接到
参数)传递到该路由


这里的原理是,由于客户端已经有了模型上下文,Ember认为没有必要从服务器上再次获取它(这是
model
hook的工作)。

这令人困惑,但根本原因是searchCriteria对象是同一个对象,尽管内容不同。因为Ember使用对象相等,所以它不认为这是一个更改。您可以通过在参数更改时创建新的searchCriteria对象来解决此问题。这不是根本问题的解决方案,但对于可能需要它的人来说,这是一种解决方法。根据本问题作者所提到的内容,
模型
设置控制器
挂钩在使用
链接到
转换到
转到父路由时不会触发。现在,我必须为孩子创建一个单独的路由,它正在工作。总是调用+1来解释setupController。没有解决我的问题,但却把我带向了正确的方向。