2

我们的团队最近采用了 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设置它们的属性。我尝试通过捕获didCreateDS.Model 上的钩子来解决这个问题(上面的注意代码)......这也不起作用。

更新:7月2日

在 WebAPIAdapter 上,我尝试将 App.Article.sources 的嵌入属性设置为始终

DS.WebAPIAdapter.map('App.Article', {
  sources: { embedded: 'always' }
});

这仍然不能解决问题。每个source仍然像 parent 一样快地访问服务器article。如何防止source对象被发布到服务器以进行特定交易(即“新文章”交易)?

也许我们对此想得太多,并且我们在某处缺少“一个配置设置”标志。我们将不胜感激任何帮助!

在此先感谢, 卢克

PS 请注意,我尝试为此创建一个小提琴:proof。然而,我花了 3 个小时才到达目的地(我不是专业的 JSFiddler),而且我显然还有更多工作需要完成。我求助于口头解释这个问题,而不是用代码片段。:)

4

2 回答 2

1

我想你需要告诉适配器你的Source模型是嵌入的。这样ArticleSource模型将在创建/删除等方面被视为一个。

尝试像这样定义它:

DS.RESTAdapter.map('App.Article', {
  sources: { embedded: 'always' }
};

对于嵌入的属性,有可能的值,load& always

load加载时子记录在加载时嵌入,但应保存为独立记录。为了使其工作,子记录必须具有正确的 id。

always总是在加载时嵌入子记录,并保存在同一记录中。

希望能帮助到你。

于 2013-07-02T21:47:56.220 回答
0

我有一个类似的问题。在分配 ID 之前,您需要等待交易完成。您必须等到下一个运行循环:

didCreate: function () {
    Ember.run.next(this, function () {
        var sources = this.get('sources'),
            id = this.get('id');

        sources.forEach(function (source) {
           source.set('articleId', id);
        });
    }
}
于 2013-07-31T08:50:31.140 回答