5

私の要件を表現する正しい方法かどうかはわかりません。しかし、「フォーク」という言葉は、Ember Data github ページのロードマップに表示されます。そして、これは EPF のキラー機能です。Ember Data でそれを行うことができるかどうか疑問に思っています。

フォーク機能は、編集ページがあり、モデルをバインドするときに役立ちます。情報を編集するとき、モデル プロパティが別の場所にも表示されていると自動的に変更されるため、モデル プロパティを変更したくありません。それは私が望むものではありません。

例として、ページの左側にリストがあり、ページの右側に特定のモデルの編集フォームがあります。テキスト フィールドでロール名を変更すると、データ バインディングのために左側のロール名が変更されます。

ここに画像の説明を入力

EPF は、既存のモデルを「フォーク」して子セッションに設定することで、この問題を解決します。EPF のセッションは、Ember Data のストアと似ています。フォークされたモデルを変更しても、メイン セッションのモデルには影響しません。フォークされたモデルが更新された後、それをメイン セッションにマージして戻すことができ、メイン セッション内の対応するモデルが更新されます。

Ember Data で考えられる解決策は、別のストアを作成し、モデルをそのストアにコピーすることです。しかし、それは少し複雑です。誰かがより良い解決策を持っていますか? stackoverflow と ember ディスカッション フォーラムで検索しましたが、答えが見つかりませんでした。

4

2 に答える 2

1

Ember でこれを行うための標準的な方法または一般的な方法があるかどうかはわかりませんが、モデルの基本的な「バッファリング」を提供するためにルートに配置できる Mixin を作成しました。

App.BufferedRouteMixin = Ember.Mixin.create({
    setupController: function(controller, model) {
        this.setBufferFromModel(controller, model);
        this._super(controller, model);
    },
    setBufferFromModel: function(controller, model) {
        var buffer = {};
        controller.set('model', model);
        model.eachAttribute(function(name, meta) {
            buffer[name] = model.get(name);
        });

        controller.set('buffer', buffer);
    },
    setModelFromBuffer: function() {
        var model = this.get('model'),
            buffer = this.get('buffer');

        model.eachAttribute(function(name, meta) {
            if (buffer[name]) {
                model.set(name, buffer[name]);
            }
        });
    }
});

これが編集ルートに追加されたら、アクションを呼び出すことができsetModelFromBufferますsave。私のテンプレートでは、{{#with buffer}}ヘルパーを使用できます。

于 2014-05-06T14:19:09.970 に答える
-1

最も簡単な解決策であると私が信じているのEmber.Objectは、モデルの構造を模倣する を用意することです。編集モードに入るときは、プロパティをモデルから にコピーしEmber.Object、ユーザーが [保存] をクリックするか、変更を元に戻す操作を行うまで、そこでプロパティを更新します。私が行った重要なことの 1 つは、Ember.Copyable私のオブジェクトにミックスインします。以下は、この問題を自分で解決するために使用したコードです。

注:: このコードは、モデルが送信される前にモデルが作成されるのを防ぐためのものでした。

App.SomeModel = DS.Model.extend({
  user: DS.belongsTo('user'),
  home: DS.belongsTo('home'),

  cost: DS.attr('number'),
  title: DS.attr('string'),
  description: DS.attr('string'),
  category: DS.attr('number'),
  categoryName: function () {
    return Roomy.enums.TransactionCategories[this.get('category')]
  }.property('category'),
  date: DS.attr('date', {
       defaultValue: function() { return new Date(); }
  }),
  fuzzyDate: function () {
    return moment(this.get('date')).fromNow();
  }.property('date'),
  split: DS.attr('boolean'),
  contributors: DS.attr('array'),
  points: DS.attr('number')
});

App.SomeModelNew = Ember.Object.extend(Ember.Copyable, {
  user: null,
  home: null,
  cost: null,
  title: null,
  description: null,
  category: null,
  date: new Date(),
  split: false,
  contributors: [],
  points: null,
  copy: function () {
    return this.getProperties('cost', 'title', 'description', 'category', 'date', 'split', 'contributors', 'user', 'home');
}
});

次に、このモデルを保存するために、次のようにしました。
注:: ユーザーとホームのコードは、関係のために使用する必要がありました。ユーザーとホームの json 形式をコピーするだけでは、関係が保持されず、データベースで必要な ID がモデルに付与されません。

以下のコントローラーコード:

//Before this function is called, all the inputs in the form have been filled in and the instance now has values for all the fields that were defined for it
saveTxn: function (txn) {
    // txn is the App.SomeModelNew instance
    copy = this.store.createRecord('transaction', txn); // this returns the App.SomeModelNew.copy() object
    copy.set('user', txn.get('user')); // OVerwrite user for relationship
    copy.set('home', txn.get('home')); // Overwrite home for relationship
    return copy.save();
}

これが役立つことを願っています。

于 2014-05-06T18:11:48.963 に答える