0

EmberJS ビューで Ember Data を使用して変更したレコードを無視するにはどうすればよいですか? 永続ストレージから実際に削除せずに削除するようなもの。

うまくいくと思いApp.store.removeFromRecordArrays(record);ました。

4

2 に答える 2

0

このケース (クライアント側を削除し、サーバー側を削除しない) がこのモデルに存在する場合は、フラグを使用して DS.Model を拡張できます。さらに、このステータスを設定するメソッドが便利です (model.deleteLocal() を呼び出します)。

DS.Model.reopen({
    deleteLocalFlag: false,
    deleteLocal: function () {
        this.set('deleteLocalFlag',true); 
        this.deleteRecord();
    }
});

次に、アダプターの deleteRecords メソッドをカスタマイズする必要があります。

DS.YourAdapter.reopen({
      deleteRecord: function(store, type, model) {
          if (!model.get('deleteLocalFlag') {
              // code for deleting in persitence layer
          } 
          store.didDeleteRecord(model, model.toJSON({associations: true}));
      }
});

警告: このコードはテストされていませんが、私の頭の中で動作します ;)

フラグを設定する代わりに、オブジェクトの stateManager を使用して別の状態に移行することが、よりクリーンな解決策になる可能性があります。しかし、stateManager の周りのコードを理解するのは非常に難しく、おそらく手間をかける価値はないと思います。

于 2012-07-06T08:05:10.657 に答える
0

1) トランザクションを使用して、トランザクションをロールバックできます。

2) または、statemanager を使用してレコードをロールバックすることもできます。

if(record.isDirty)
  record.get('transaction').rollback();

たとえば、ストア recordCache 内のすべてのレコードをループし、ダーティ レコードをロールバックできます。

ビューの willDestroyElement イベントでレコード ロールバック メカニズムを個人的に使用しているため、ユーザーがビューを離れた場合、ダーティ レコードを保存するように求められます。

PatientTransport.FirmView = Ember.View.extend({
  templateName: 'firm-view',

  willDestroyElement: function() {
    if (this.getPath('controller.content.isDirty')) {
      var self = this;
      Bootstrap.ConfirmBox.popup({
        heading: "Some data has changed.",
        message: "Do you want to save changes?",
        callback: function(options, event) {
          if (options.primary) {
            self.getPath('controller.content.transaction').commit();
          } else {
            self.getPath('controller.content.transaction').rollback();
          }             
        }
      });   
    }     
  }
});
于 2012-07-05T19:21:45.630 に答える