Ember.js属于未定义的关系,但已填充了多个数组

时间:2013-03-25 07:04:03

标签: ember.js ember-data tastypie

使用带有Django REST适配器的ember-data。在setupController挂钩

中根据接收到的模型关系设置控制器内容时遇到问题

我把断点放进去了,按顺序排列:

  1. ArtistRoute.model
  2. ArtistTrackRoute.model
  3. ArtistRoute.setupController
  4. ArtistTrackRoute.setupController
  5. 请参阅这些功能中的评论以获取更多信息/问题。

    曲目的主要艺术家是曲目 - > belongsTo - >专辑 - > belongsTo - >艺术家

    艺术家: 艺术家 - > hasMany - >相册

    相册 专辑 - > belongsTo - >艺术家 专辑 - > hasMany - >轨道

    轨道 跟踪 - > belongsTo - >专辑

    我已经检查了我的api输出,资源链接肯定在那里。

    这是我的模特:

    App.Album = DS.Model.extend({
        'title' : DS.attr('string'),
        'slug' : DS.attr('string'),
        'year' : DS.attr('number'),
        'type' : DS.attr('string'),
        'image' : DS.attr('string'),
        'genre' : DS.attr('string'),
        'tracks' : DS.hasMany('App.Track'),
        'artist' : DS.belongsTo('App.Artist')
    });
    
    App.Track = DS.Model.extend({
        'title' : DS.attr('string'),
        'slug' : DS.attr('string'),
        'artists_titles' : DS.attr('string'),
        'artists_ids' : DS.attr('string'),
        'artists_slugs' : DS.attr('string'),
        'year' : DS.attr('number'),
        'genre' : DS.attr('string'),
        'label' : DS.belongsTo('App.Label'),
        'album' : DS.belongsTo('App.Album'),
        'creator' : DS.attr('number'),
        'created' : DS.attr('date'),
        'modified' : DS.attr('date'),
    });
    
    App.Artist = DS.Model.extend({
        'title' : DS.attr('string'),
        'image' : DS.attr('string'),
        'slug' : DS.attr('string'),
        'genre' : DS.attr('string'),
        'creator' : DS.attr('number'),
        'created' : DS.attr('date'),
        'modified' : DS.attr('date'),
        'absoluteUrl' : DS.attr('string'),
        'resourceUri' : DS.attr('string'),
        'albums' : DS.hasMany('App.Album'),
        'getImageURL' : function() {
            return (this.get('image')) ? '/static/img/' + this.get('image') + '.jpg' : false;
        }.property('image')
    });
    

    这是我的路线:

    App.ArtistRoute = Ember.Route.extend({
        'model' : function(params) {
            // here first
            return App.Artist.find(params.artist_id);
        },
        'serialize' : function(model) {
            "use strict";
            return {
                'artist_id' : model.get('id'),
                'artist_slug' : model.get('slug')
            };
        },
        'setupController' : function(controller, artist) {
            // here third...
            // I inspected artist._data
            // artist._data.hasMany.albums = [1]
            this.controllerFor('artist').set('content', artist);
        }
    });
    
    App.ArtistTrackRoute = Ember.Route.extend({
       'model' : function(params) {
            // here second
           return App.Track.find(params.track_id);
       },
       'serialize' : function(model) {
           "use strict";
           return {
               'track_id' : model.get('id'),
               'track_slug' : model.get('slug')
           }
       },
       'setupController' : function(controller, track) {
            // here fourth... I inspected the track data object
            // track._data.belongsTo.album == undefined
    
            // what I'm trying to achieve here is to set the album
            // controller based on the belongsTo relationship
            // this.controllerFor('album').set('content', track.get('album'))
           this.controllerFor('track').set('content', track);
    
       }
    });
    

    此外,当在ArtistAlbumRoute.setupController中进行断点操作时,我注意到album._data.hasMany.tracks == [1] 但是album._data.belongsTo.artist == undefined .... wtf?!?!?!

    我仍然很难在Ember身边缠头,所以我非常感谢任何额外的建议。谢谢!

    此外,在页面加载并打开控制台后,我会输入什么来访问控制器以查看设置内容?

1 个答案:

答案 0 :(得分:0)

事实证明,我的Tastypie资源设置与...

有关

https://github.com/escalant3/ember-data-tastypie-adapter/issues/18

我的TrackResource看起来像这样:

class TrackResource(ModelResource):

    album = fields.ToOneField('samped.api.resources.AlbumResource', 'album')

    class Meta:
        queryset = Track.objects.all()

我所要做的就是在专辑中添加“_id”

class TrackResource(ModelResource):

    album_id = fields.ToOneField('samped.api.resources.AlbumResource', 'album')

    class Meta:
        queryset = Track.objects.all()

然后我能够做到:

App.ArtistTrackRoute = Ember.Route.extend({
   'model' : function(params) {
       return App.Track.find(params.track_id);
   },
   'serialize' : function(model) {
       "use strict";
       return {
           'track_id' : model.get('id'),
           'track_slug' : model.get('slug')
       }
   },
   'setupController' : function(controller, track) {
       this.controllerFor('track').set('content', track);
       this.controllerFor('album').set('content', track.get('album'))
   }
});