私たちのチームは最近、EmberJS をフロントエンド フレームワークとして採用しました。私たちのアプリケーションは、EmberJS と対話する WebAPI コントローラーを備えた ASP.NET MVC 4 アプリケーションです。それはほとんど魔法のように機能し、私たちはそれを本当に気に入っています! しかし、どうしても解決できていない状況があります。私たちはそれにあまりにも多くの時間を費やしました.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
プロパティがまだ設定されていないことです。DS.Modelのフックをトラップすることで、これを回避しようとdidCreate
しました (上記の通知コード)... これも機能しません。
更新: 7 月 2 日
WebAPIAdapter で、App.Article.sources に対して常に埋め込みプロパティを設定してみました。
DS.WebAPIAdapter.map('App.Article', {
sources: { embedded: 'always' }
});
これでも問題は解決しません。それぞれsource
が、親と同じ速度でサーバーにアクセスしていますarticle
。source
オブジェクトが特定のトランザクション (つまり、'New Article' トランザクション) でサーバーにポストされないようにするにはどうすればよいですか?
おそらく私たちはこれを考えすぎており、どこかに欠けている「1 つの構成設定」フラグがあります。これについて何か助けていただければ幸いです。
前もってありがとう、リュック
PSこのためのフィドルを作成しようとしたことに注意してください:証明。しかし、ここまでたどり着くまでに 3 時間以上かかりました (私はプロの JSFiddler ではありません)。コード スニペットを使用する代わりに、問題を口頭で説明することにしました。:)