【问题标题】:setupController not being called when using {{linkTo}} or transtionTo("path", model);使用 {{linkTo}} 或 transitionTo("path", model); 时未调用 setupController;
【发布时间】:2013-03-21 13:06:04
【问题描述】:

使用 {{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 有什么不同,因此什么也不做。

这是一个错误吗?

【问题讨论】:

  • 令人困惑,但根本原因是searchCriteria对象是同一个对象,尽管内容不同。由于 Ember 使用对象相等性,因此它不会将此视为更改。您可以通过在参数更改时创建新的 searchCriteria 对象来解决此问题。
  • 这不是根本问题的解决方案,但对于可能需要它的人来说,它是一种解决方法。按照这个问题的作者提到的内容,modelsetupController 钩子不会从使用 link-totransitionTo 转到父路由时触发。现在,我必须为孩子创建一条单独的路线,它正在工作。

标签: javascript ember.js javascript-framework


【解决方案1】:

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

setupController 每次输入路由时都会调用。但是model钩子可能不会每次都被调用。

查看 Ember 指南:http://emberjs.com/guides/routing/specifying-a-routes-model/

注意:具有动态段的路由只有在通过 URL 输入时才会调用其模型挂钩。如果路由是通过转换输入的(例如,当使用链接到 Handlebars 帮助器时),则已经提供了模型上下文并且不会执行钩子。没有动态段的路由将始终执行模型挂钩。

一般来说,如果你点击link-to生成的链接进入路由,Ember不会为那个路由调用model hook。相反,它将模型(link-to 参数)传递给该路由。

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

【讨论】:

  • +1 用于解释 setupController 总是被调用。没有解决我的问题,但把我引向了正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2015-03-15
相关资源
最近更新 更多