gpt4 book ai didi

javascript - 使用 {{linkTo}} 或 transtionTo ("path"模型时未调用 setupController);

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:19:20 25 4
gpt4 key购买 nike

在使用 {{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}} 是从与 Controller 和路由器相同的模板中调用的(即,linkTo 在搜索中模板,它正在调用 SearchRoute)。在工作情况下,正在 SearchRoute 上调用 linkTo,但来自属于不同路由器的不同模板。

在 Chrome 调试 Ember 代码后,我发现路由器没有被调用是因为 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 的相关部分:

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

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

这是一个错误吗?

最佳答案

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

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

参见 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不会调用该路由的model hook。相反,它将模型(link-to 参数)传递给该路由。

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

关于javascript - 使用 {{linkTo}} 或 transtionTo ("path"模型时未调用 setupController);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15726815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com