Ember.js:从集合中检索随机元素

时间:2013-01-31 08:36:07

标签: javascript ember.js

我有这样一条路线:

App.RandomThingRoute = Ember.Route.extend({
  model: function() {
    return App.Thing.find("random");
  }
});

前往/things/random API endopoint。

我也是控制器中的一个动作:

App.RandomThingController = Ember.ObjectController.extend({
  displayRandomThing: function() {
    return this.content.reload();
  }
});

重新加载模板中的随机内容。

我刚刚开始使用Ember.js(或任何MVC前端框架)并且我有一些疑问/问题:

  1. 首先:这是一种正确的做事方法(this.content.reload())?
  2. 我的API端点接受old_thing参数,该参数允许获取与当前显示的不同的随机事物:/things/random?old_thing=Something。在Ember.js中实现这个的最惯用/最正确的方法是什么?如何将此old_thing传递给find()reload()?我应该按照此处的建议使用视图:Preferred way to retrieve data from a template in EmberJS
  3. 我很难找到一些关于ember-data的文档(一切都觉得过时)。

2 个答案:

答案 0 :(得分:0)

1 - 我宁愿在控制器中以这种方式重新加载内容:

reloadContent: function(){
    this.set('content', App.Thing.find("random"));
}

2 - 如果你想将参数传递给你的GET(假设你正在使用RESTAdapter),你可以使用哈希传递它们。

App.Thing.find({old_thing: 'oldThing');

但这里有一些“腥”的东西。 Model.find需要一个id或一个哈希。你的'随机'有点像。

我不知道你是否可以在你使用“随机”时加注参数。这种感觉有点不对,因为你已经开始想要获得单个项目,但是也在发送哈希以过滤项目。 (doh不是你的意图)

答案 1 :(得分:0)

我来找这个问题的答案,最后来到这里。我需要为我的模型找到一个随机记录,并且不确定如何调用商店的find方法。

在查看ember-data源之后,我发现将对象传递给find方法会将存储从findById切换到findQuery。

这让我觉得为一个随机对象调用find的一个不错的方法可能是:

App.Thing.find({random:true, old_thing: 'oldThing', limit:1});

这些将转换为查询参数,然后您需要修改您的API'Thing'端点以接受。

api/thing?random=true&old_thing=oldThing&limit=1

允许将随机标记和限制作为参数传入,这意味着您不必使用额外的路径来查找API以查找随机记录。

我不确定这是否是最常用的方式,但这是我选择的方式。

编辑:

请注意,如果您这样查询,您的API与Ember Data结合应该返回一个包含一个元素的数组。现在,因为调用是异步调用的,所以在调用“find”后不会立即定义该元素,所以你必须添加一个观察者来在项目加载后更新控制器的内容。

在我的赛道控制器上有这样的东西:

, randomiseTrack: function(){
        var _this = this
        var currentTrackId = this.get('content.id')
        var loadingTrackList = App.Track.find({
            random:true, 
            current_track_id: currentTrackId, 
            limit: 1
        });
        loadingTrackList.addObserver("isLoaded", function(){
            _this.set('content', loadingTrackList.materializedObjectAt(0));
        });
}