0

将 ember-data 与 Django REST 适配器一起使用。根据 setupController 挂钩中收到的模型的关系设置控制器内容时遇到问题

我放了断点,它们按以下顺序排列:

  1. ArtistRoute.model
  2. ArtistTrackRoute.model
  3. ArtistRoute.setupController
  4. ArtistTrackRoute.setupController

有关更多信息/问题,请参阅这些功能中的评论。

曲目的主要艺术家是 track -> belongsTo -> album -> belongsTo -> artist

艺术家:艺术家 -> hasMany -> 专辑

专辑专辑 -> belongsTo -> 艺术家专辑 -> hasMany -> 曲目

曲目 -> 属于 -> 专辑

我检查了我的 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,因此非常感谢任何额外的建议。谢谢!

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

4

1 回答 1

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'))
   }
});
于 2013-03-25T07:24:12.917 回答