【问题标题】:Ember initializing route model with queryEmber 使用查询初始化路由模型
【发布时间】:2013-02-17 18:33:01
【问题描述】:

我正在尝试使用 DS 查询初始化 Route 的模型,如下所示

App.Router.map(function() {
    this.resource('post', { path: '/posts/:post_slug' });
});

App.PostsRoute = Ember.Route.extend({
    model: function(params) {
        var records = App.Post.find({ slug: params.post_slug });
        return records.get('firstObject');
    }
});

在这里,我通过它的 slug 找到一个 Post 并将第一个结果设置为路由模型。但由于records 是异步填充的,因此模型数据设置不正确。这样做的正确方法是什么?

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    使用延迟模式解决了这个问题。

    App.PostsRoute = Ember.Route.extend({
        model: function(params) {
            var records = App.Post.find({ slug: params.post_slug });
            var promise = Ember.Deferred.create();
            records.addObserver('isLoaded', function() {
                promise.resolve(records.get('firstObject'));
            });
            return promise;
        }
    });
    

    【讨论】:

    • 感谢您的提问,非常感谢您的回答!注释虽然,路由名称应该是 PostRoute(单数形式),c/d ?
    • 当您解决承诺时,您是否应该调用 removeObserver 以获得最佳实践。
    【解决方案2】:

    应该可以做到这一点:

    App.Router.map(function() {
      this.resource('posts');
      this.resource('post', { path: '/posts/:post_id' });
    });
    
    App.PostsRoute = Ember.Route.extend({
      model: function() {
        return App.Post.find();
      }
    });
    
    App.PostRoute = Ember.Route.extend({
      model: function(params) {
        return App.Post.find(params.post_id);
      }
    });
    

    【讨论】:

    • 我纠正了一个错字。我试图通过运行查询来通过它的 slug 找到该帖子。我不想在路由路径中使用 post_id。
    • @z33m 您仍然必须使用App.Post.find(post_id),但必须在您的控制器中定义一个方法。你能通过一个例子澄清你想要做什么吗?也许是 jsfiddle?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多