编程语言
首页 > 编程语言> > javascript – 使用{{linkTo}}或transtionTo(“path”,model)时没有调用setupController;

javascript – 使用{{linkTo}}或transtionTo(“path”,model)时没有调用setupController;

作者:互联网

使用{{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,但是从属于不同路由器的不同模板调用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:找到root问题 – bug?

我想我理解为什么处理程序没有被触发的根本原因,我认为这是因为partitionHandlers(oldHandlers,newHandlers)方法不认为模型已经改变,因此不会触发处理程序.

具体而言,这是该观点的相关部分:

{{view Ember.Checkbox checkedBinding="searchCriteria.music"}} Music
{{#linkTo search searchCriteria}}Search{{/linkTo}}

虽然用户勾选了复选框(从而改变了searchCriteria的状态),但Ember并不认为searchCriteria有任何不同,因此不做任何事情.

这是一个错误吗?

解决方法:

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

每次输入路由时都会调用setupController.但每次都不能调用模型钩子.

请参见Ember指南:http://emberjs.com/guides/routing/specifying-a-routes-model/

Note: A route with a dynamic segment will only have its model hook called when it is entered via the URL. If the route is entered through a transition (e.g. when using the link-to Handlebars helper), then a model context is already provided and the hook is not executed. Routes without dynamic segments will always execute the model hook.

一般来说,如果单击link-to生成的链接以输入路线,Ember将不会为该路线调用模型挂钩.相反,它将模型(link-to参数)传递给该路线.

这里的理念是,因为客户端已经具有模型上下文,Ember认为没有必要从服务器再次获取它(这是模型钩子的工作).

标签:javascript,javascript-framework,ember-js
来源: https://codeday.me/bug/20190709/1410545.html