我们的团队最近采用了 EmberJS 作为我们的前端框架!我们的应用程序是一个 ASP.NET MVC 4 应用程序,带有与 EmberJS 交互的 WebAPI 控制器。它的工作方式几乎是神奇的,我们真的很喜欢它!但是,我们有一个根本无法解决的情况。我们花了太多时间在上面,我希望 StackOverflow 上的某个人能够帮助我们。
该应用程序非常简单。用户可以创建一篇文章并引用他们从中获取信息的许多来源。我们的模型设置如下:
// ARTICLES MODEL
App.Article = DS.Model.extend({
status: DS.attr("string"),
title: DS.attr("string"),
body: DS.attr("string"),
sources: DS.hasMany("App.Source"),
didCreate: function () {
var sources = this.get('sources');
var id = this.get('id'); // <-- this is always null (?)
debugger;
sources.forEach(function (source) {
source.set('articleId', id);
});
},
});
// SOURCE MODEL
App.Source = DS.Model.extend({
name: DS.attr("string"),
url: DS.attr("string"),
article: DS.belongsTo("App.Article")
});
// ARTICLES.NEW CONTROLLER
App.ArticlesNewController = Ember.ObjectController.extend({
// ... removed for brevity
addSource: function(){
var self = this;
var source = App.Source.createRecord({
articleId: self.get('id')
});
self.get('model.sources').addObject(source);
},
/* we also tried this, but it sends sources individually as well
addSource: function() {
this.get('model.sources').createRecord();
},
*/
});
我们能够让一切正常工作。但是,在创建文章时,由于用户能够输入文章的所有属性以及添加多个来源,然后再将所有内容提交到服务器,因此会出现问题。问题是当我们将数据发布到服务器时,所有模型都试图尽可能快地冲向服务器,而Source
对象还没有articleId
设置它们的属性。我尝试通过捕获didCreate
DS.Model 上的钩子来解决这个问题(上面的注意代码)......这也不起作用。
更新:7月2日
在 WebAPIAdapter 上,我尝试将 App.Article.sources 的嵌入属性设置为始终:
DS.WebAPIAdapter.map('App.Article', {
sources: { embedded: 'always' }
});
这仍然不能解决问题。每个source
仍然像 parent 一样快地访问服务器article
。如何防止source
对象被发布到服务器以进行特定交易(即“新文章”交易)?
也许我们对此想得太多,并且我们在某处缺少“一个配置设置”标志。我们将不胜感激任何帮助!
在此先感谢, 卢克
PS 请注意,我尝试为此创建一个小提琴:proof。然而,我花了 3 个小时才到达目的地(我不是专业的 JSFiddler),而且我显然还有更多工作需要完成。我求助于口头解释这个问题,而不是用代码片段。:)