6

我正在 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 方法。

4

2 回答 2

9

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

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

在这里解释。

因此,正如本期所讨论的,在这些情况下,请使用setupController钩子来获取您的模型。

您的代码的工作,与setupController

于 2013-09-05T17:54:28.393 回答
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() 之后立即调用。

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

于 2015-10-13T12:31:16.267 回答