如何修改此ember.js函数以返回Enumerable或Array

时间:2012-10-10 17:25:21

标签: ember.js

我刚刚开始学习ember.js,我已经学过一些教程和created a working example here

App.Track.reopenClass({
    find: function() {
        var tracks = [];

        $.ajax({
            url: 'http://ws.spotify.com/lookup/1/.jsonuri=spotify:album:6J6nlVu4JMveJz0YM9zDgL&extras=track',
            dataType: 'json',
            context: this,
            success: function(data, textStatus, jqXHR) {
                $.each(data.album.tracks, function(index, value) {
                    track_id = value.href.replace("spotify:track:", "");
                    tracks.addObject(App.Track.create(value));
                    // I would rather do something like:
                    // tracks[track_id] = App.Track.create(value)
                });
            }
        })
        return tracks;
    }
});

此函数命中API并循环返回的数据以填充track对象(tracks.addObject(App.Track.create(value));)并返回它。

我不想从这个函数中获取普通对象,而是想获得一个Enumerable / Array,这样我就可以使用filterProperty来操作它或者通过id拉出轨道(有一个track_id我想用作数组索引)。

当ajax调用填充轨道时,我所有使用数组的尝试都破坏了ember神奇的更新视图的能力。

任何人都可以修改http://jsfiddle.net/ZEzwn/以返回Enumerable(最好是数组),但仍会自动更新视图吗?

2 个答案:

答案 0 :(得分:1)

由于您的方法已经返回一个数组(因为您启用了Ember原型扩展),执行:

var tracks = [];

相当于

var tracks = Ember.A();

在ajax请求成功时,您只需填充数组,因此可以使用Ember.ArrayfilterProperty方法。

关于使用id作为数组键的一件事,你真的不应该像Ryan Bigg says in its blog一样:

  

但是,如果变体的id是[某个更高的东西,比如] 1,013,589,413,那么你就会遇到问题。

     

在这种情况下,JavaScript将创建一个十亿,一千三百万,五十八万九千四百四十四个元素阵列。所有都要存储一个值,直到最后。

答案 1 :(得分:0)

好的,现在正在运行,正如louiscoquio指出的那样,跟踪IS是一个可枚举的对象,我可以做像

这样的事情

tracks.filterProperty('href', 'spotify:track:7x7F7xBqXqr0L9wqJ3tuQW')

tracks.getEach('name')

tracks.get('firstObject')