2014-01-15 5 views
2

В настоящее время я работаю над созданием приложения ember с использованием ember/ember-data/ember-data-django-rest-adapter с бэкэндом Django.createRecord с данными ember-data + ember-data-django-rest-adapter

У меня возникла проблема с созданием записи, когда есть что-то связанное с отношениями hasMany.

настоящее время у меня этот код:

App.Article = DS.Model.extend({ 
    title: attr(), 
    description: attr(), 
    authors: hasMany('author'), 
    category: belongsTo('page'), 
    slug: attr(), 
    content: attr(), 
    articleContent: Ember.computed.alias("content"), 
    published: attr(), 
    publish_from: attr(), 
    isScheduled: function() { 
    return moment().isBefore(moment(this.get('publish_from'))); 
    }.property('publish_from'), 
    articlePublishDate: function() { 
    return moment(this.get('publish_from')).format('MMMM Do YYYY'); 
    }.property('publish_from'), 
    articlePublishTime: function() { 
    return moment(this.get('publish_from')).format('h:mm a'); 
    }.property('publish_from'), 
    //content_type: belongsTo('content_type', { async: true }), 
    content_type: attr() 
}); 

App.Page = DS.Model.extend({ 
    title: attr(), 
    description: attr(), 
    pageContent: attr(null, { 
    key: 'content' 
    }), 
    templateFile: attr(null, { 
    key: 'template' 
    }), 
    slug: attr(), 
    tree_path: attr(), 
    tree_parent: belongsTo('page'), 
    site: attr() 
}); 

App.Author = DS.Model.extend({ 
    name: attr(), 
    slug: attr(), 
    description: attr(), 
    text: attr(), 
    email: attr(), 
    photo: attr(), 
    user: belongsTo('user'), 
}); 

// create article 
App.ArticleCreateController = Ember.ObjectController.extend({ 

    editMode: false, 

    allAuthors: function() { 
    return this.store.find('author'); 
    }.property(), 

    allPages: function() { 
    return this.store.find('page'); 
    }.property(), 

    actions: { 

    save: function(session) { 
     var self = this; 
     var article = this.get('model'); 

     var newArticle = this.store.createRecord('article', { 
     content_type: "19", 
     content: article.get('articleContent'), 
     description: article.get('description'), 
     publish_from: article.get('publish_from'), 
     published: article.get('published'), 
     slug: article.get('slug'), 
     title: article.get('title') 
     }); 

     this.store.find('page', 3).then(function(page) { 
     newArticle.set('category', page); 
     }); 

     newArticle.save(); 

    } 

    } 
}); 

Все, что я действительно хочу сделать, это POST данные, как это apiRoot/статьи/(наряду с другими атрибутами, но те, которые работают так, как они должны)

авторы: [1,3,5], // hasMany

категория: 3 // belongsTo

Но когда я делаю запрос POST, категория по какой-то причине возвращает null. Все, что я хочу извлечь из него, это просто сам идентификатор. Кроме того, я не знаю, как извлечь массив авторов. Я попытался опубликовать данные, и он говорит мне что-то о том, что нужно быть «App.Author».

ответ

2

Во-первых, в настоящее время вам нужна вилка данных ember-данных, так как асинхронное создание в настоящее время нарушено (поскольку это обещание, и внутренний сериализатор не будет ждать его разрешения).

Сдвиньте эту ветвь, выполните установку npm install + grunt, чтобы построить адаптер. Кроме того, необходимо использовать раздвоенный сборку Эмбер-данных в этом каталоге тест branch'es Lib (до уголек-данных не тянет исправления для этого)

https://github.com/toranb/ember-data-django-rest-adapter/tree/asyncBelongsToHasManyWIP

Затем внутри вашего контроллера вы можете сделать что-то вроде это для «создания» клиента и назначения (уведомление -aync принадлежит To/hasMany)

App.Customer = DS.Model.extend({ 
    name: DS.attr('string'), 
    appointments: DS.hasMany('appointment', { async: true}) 
}); 

App.Appointment = DS.Model.extend({ 
    details: DS.attr('string'), 
    customer: DS.belongsTo('customer', { async: true}) 
}); 

var customer = { 
    name: 'foobar' 
} 
this.store.createRecord('customer', customer).save().then(function(persisted) { 
    var appointment = { 
    details: 'test', 
    customer: persisted 
    } 
    return self.store.createRecord('appointment', appointment).save().then(function(apt) { 
    persisted.get('data').appointments.pushObject(apt); 
    router.transitionTo('index'); 
    }); 
}); 
+0

Работал отлично. Ты обалденный. Спасибо! –

+0

Спасибо! теперь я просто надеюсь, что он втянут в ядро ​​ember-data: D –

Смежные вопросы