2

我刚刚开始学习 ember.js,我遵循了一些教程并在这里创建了一个工作示例

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 并循环通过返回的数据来填充轨道对象 (tracks.addObject(App.Track.create(value));) 并返回它。

我不想从这个函数中取回一个普通的对象,而是想要一个 Enumerable / Array 以便我可以使用 filterProperty 操作它或按 id 拉出轨道(有一个 track_id 我想用作数组索引)。

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

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

4

2 回答 2

1

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

var tracks = [];

相当于

var tracks = Ember.A();

在 ajax 请求成功时,您只是在填充数组,因此您可以Ember.Array使用filterProperty.

使用 id 作为数组键只有一件事,你真的不应该,正如Ryan Bigg 在其博客中所说

但是,如果变体的 id 是 [稍高一些,例如] 1,013,589,413,那么您就会遇到问题。

在这种情况下,JavaScript 将创建一个 10 亿、1300 万、589 万、414 元素数组。全部存储一个值,就在最后。

于 2012-10-11T09:11:43.763 回答
0

好的,正如 louiscoquio 指出的那样,这现在正在工作,轨道是一个可枚举的对象,我可以做类似的事情

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

tracks.getEach('name')

tracks.get('firstObject')

于 2012-10-11T09:11:50.873 回答