2

私たちのチームは最近、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が、親と同じ速度でサーバーにアクセスしていますarticlesourceオブジェクトが特定のトランザクション (つまり、'New Article' トランザクション) でサーバーにポストされないようにするにはどうすればよいですか?

おそらく私たちはこれを考えすぎており、どこかに欠けている「1 つの構成設定」フラグがあります。これについて何か助けていただければ幸いです。

前もってありがとう、リュック

PSこのためのフィドルを作成しようとしたことに注意してください:証明。しかし、ここまでたどり着くまでに 3 時間以上かかりました (私はプロの JSFiddler ではありません)。コード スニペットを使用する代わりに、問題を口頭で説明することにしました。:)

4

2 に答える 2

1

Sourceモデルが埋め込まれていることをアダプタに伝える必要があると思います。このようにして、ArticleSourceモデルは、作成/削除などに関して 1 つとして扱われます。

次のように定義してみてください。

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

埋め込みプロパティには、可能な値load&がありalwaysます。

load: loadを使用すると、ロード時に子レコードが埋め込まれますが、スタンドアロン レコードとして保存する必要があります。これが機能するためには、子レコードに適切な ID が必要です。

always:ロード時に常に子レコードが埋め込まれ、同じレコードに埋め込まれて保存されます。

それが役に立てば幸い。

于 2013-07-02T21:47:56.220 に答える