我在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方法。
答案 0 :(得分:9)
未调用IndexRoute.model
方法的原因。是
具有动态段的路径只有在通过URL输入时才会调用其模型钩子。如果通过转换输入路线(例如,当使用链接到Handlebars帮助器时),则已经提供了模型上下文并且不执行钩子。没有动态段的路由将始终执行模型挂钩。
解释here。
正如在this issue中所讨论的那样,在这些情况下,使用setupController
钩子来获取模型。
使用setupController
答案 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()之后立即调用。
第二个对我很好。希望它有用并回答上述问题。