我刚刚开始学习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(最好是数组),但仍会自动更新视图吗?
答案 0 :(得分:1)
由于您的方法已经返回一个数组(因为您启用了Ember原型扩展),执行:
var tracks = [];
相当于
var tracks = Ember.A();
在ajax请求成功时,您只需填充数组,因此可以使用Ember.Array
等filterProperty
方法。
关于使用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')