正确的TransitionToRoute方式

时间:2013-09-04 22:05:44

标签: javascript ember.js

我在ember.js上进行实时搜索。这是代码

App.Router.map ->
    @resource "index", {path : "/"}
    @resource "index", {path : "/:query"}

App.Torrents =
    findByQuery : (query) ->
        url = "/api/find/#{query}"
        $.getJSON(url)

App.IndexRoute = Ember.Route.extend

    model : (params) ->
        App.Torrents.findByQuery(params.query)

App.IndexController = Ember.ArrayController.extend

    onChangeQuery : _.debounce(->
        query = @get("query")
        @transitionToRoute("index", {query  : query})
    , 500).observes("query")

我有一个绑定到输入的查询属性。当输入更改我想转换到传递新查询参数的路由时,但是没有调用IndexRoute.model方法。

2 个答案:

答案 0 :(得分:9)

未调用IndexRoute.model方法的原因。是

  

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

解释here

正如在this issue中所讨论的那样,在这些情况下,使用setupController钩子来获取模型。

使用setupController

工作bin您的代码

答案 1 :(得分:2)

对不起,我迟到了,这可能对你没用。我只是想在这里发布,如果它可能对其他人有用。

此链接帮助我,清除了我的问题。

方法1:我们可以为路线提供模型。该模型将使用路径的序列化挂钩序列化到URL中:

var model = self.store.find( 'campaign', { fb_id: fb_id } );
self.transitionToRoute( 'campaign', model);

这适用于路由,但URL可能会被篡改。对于这种情况,我们需要添加额外的逻辑来序列化传递给新路由的对象并更正URL。

方法2:如果传递了文字(例如数字或字符串),则会将其视为标识符。在这种情况下,将触发路线的模型钩子:

self.transitionToRoute( 'campaign', fb_id);

这会调用model()并在路由时正确显示所需的URL。 setupController()将在model()之后立即调用。

第二个对我很好。希望它有用并回答上述问题。