在Ember

时间:2015-10-12 17:09:47

标签: javascript arrays ember.js ember-data ember-cli

我正在使用他们的API

编写一个音乐播放器组件,其中包含来自SoundCloud的收藏歌曲

我希望在上一首歌完成后自动播放下一首喜欢的歌曲。

我们的想法是创建一个新属性来表示我所有收藏夹的数组以传递nextFavorite

这是我的播放器控制器

sortedFavorites: Ember.computed.alias('favorites’),

actions: {
    selectFavorite: function(favorite, index, play) {
            if (!this.get('externalPlay')) {
                index = index + 1;
                nextFavorite = this.get('sortedFavorites').nextObject(index, favorite);
                self.set('nextFavorite', nextFavorite);
            }
            return SC.stream(favoritePath, {
                onfinish: function() {
                    self.set('isPlaying', false);
                    if (self.get('nextFavorite') != null) {
                        return self.send('selectFavorite', self.get('nextFavorite'), index);
                    }
                }
            }
        }
   }
}

当我为“收藏夹”创建新属性时,它是未定义的

enter image description here

如果我为单个收藏夹创建别名,我可以访问我的单个收藏夹,虽然这不是我需要做的事情

enter image description here

我的问题是,最喜欢的模型没有DS.hasMany指向DS.Model

所以我不知道如何计算

这是最喜欢的型号

import DS from 'ember-data';

var Favorite = DS.Model.extend({
    duration: DS.attr('string'),
    title: DS.attr('string'),
    genre: DS.attr('string'),
    artwork_url: DS.attr('string'),
    uri: DS.attr('string'),
    users: DS.hasMany('user')
});

export default Favorite;

那么sortedFavorite怎么能成为我所有收藏夹的数组才能访问nextObject(最喜欢的)?

路线

var MusicRoute = Ember.Route.extend({
    needs: ['player'],
    player: Ember.computed.alias('controllers.player'),
    beforeModel: function() {
        return SC.initialize({
            client_id: window.soundcloud_api_key,
            redirect_url: '#'
        });
    },
    model: function(params) {
        var artist, self, ret;
        self = this;
        artist = params.artist;
        ret = [];
        this.controllerFor('application').set('artistName', artist);

        return new Ember.RSVP.Promise(function(resolve, reject) {
            return SC.get("/users/" + 'mannaio' + "/favorites", {
                limit: 40
            }, function(favorites) {
                if (favorites.length) {
                    favorites.forEach(function(item) {
                        var favorite;
                        favorite = self.createFavoritelist(item);
                        ret.push(favorite);
                        favorite.user = self.createUser(item.user);
                    });
                    resolve(ret);                
                } else {
                  return reject(self.errorHandler(artist));
                }
            });
        });
    },
    setupController: function(controller, model) {
        var favorite ;
        this._super(controller, model);
        favorite = model.get('firstObject');
        this.controllerFor('player').set('favorite', favorite).send('selectFavorite', favorite, 0, false);
        return controller;
    },
    renderTemplate: function() {
        this._super();
        return this.render('player', {
            into: 'music',
            outlet: 'player',
            controller: 'player'
        });
    },
    createFavoritelist: function(favorite) {
        return this.store.createRecord('favorite', {
            id: favorite.id,
            title: favorite.title,
            duration: favorite.duration,
            uri: favorite.uri,
            artwork_url: favorite.artwork_url,
            genre: favorite.genre,
        });
    },
    createUser: function(user) {
        return this.store.createRecord('user', {
            username: user.username,
            avatar_url: user.avatar_url,
        });
    },
});

1 个答案:

答案 0 :(得分:1)

看起来收藏夹没有真正定义?

也许在模型上做一个别名(如果你想要一个别名)或者一个副本,如果没有?

此外,您不必从setupController返回控制器..

尝试在收藏夹控制器上设置模型?

self.controllerFor('player').set('favorites', model);

在您的设置控制器中,您不需要第二个别名。

如果这不起作用,您也可以尝试让播放器控制器访问音乐控制器(我认为这是音乐控制器) 添加:

needs : 'music'

然后你应该有权访问音乐控制器:

this.get('controller.music.model') -> favorites

到播放控制器,你应该可以访问音乐模型,它看起来像你最喜欢的..

http://guides.emberjs.com/v1.10.0/controllers/dependencies-between-controllers/