0

ワークフローは次のとおりです。

  1. ユーザーは新しいページを表示しています。
  2. 保存をヒットすると、モデルの検証が失敗します。モデルにバインドされたエラーが表示されます。まだ同じページにあります。
  3. これで、ユーザーは[インデックス]ページに移動し、リストに追加された無効なレコードを確認できます。

ArrayControllerは、検証に失敗したレコードを追加しているようです。

App.CompaniesNewRoute = Ember.Route.extend({

    model: function(){
      var company = App.Company.createRecord();
      this.wireObservers(company, this);
      return company;
    },

    events: {
      save: function(){
        var controller = this.controllerFor(this.routeName);
        controller.get('transaction').commit();
      }
    },

   wireObservers: function(company, router) {
     company.on('becameInvalid', function(record){
      // do something to remove it from the arraycontroller
      // record.rollback();
     });

     company.on('didCreate', function(){
       router.transitionTo('companies.index')
     });
   })
})

becameInvalidイベントは呼び出されます。スローを実行record.rollback()すると、例外がスローされます。

Uncaught Error: Attempted to handle event `becameClean` on     <App.Company:ember612:null> while in state rootState.loaded.created.invalid. Called with undefined ember-data.js:3495
DS.StateManager.Ember.StateManager.extend.unhandledEvent ember-data.js:3495

ArrayControllerが検証に失敗したレコードを追加するのを防ぐ方法はありますか?

4

2 に答える 2

1

代わりに、ストアを介してトランザクションをロールバックしてみてください。

   wireObservers: function(company, router) {
     var _self = this;
     company.on('becameInvalid', function(record){
      // do something to remove it from the arraycontroller
       _self.store.rollback();
     });

     company.on('didCreate', function(){
       router.transitionTo('companies.index')
     });
   })

デフォルトのトランザクションを使用するのではなく、目的のために特定のトランザクションを作成することを検討する必要があります。ルート内に新しいトランザクションを作成するには、次のようにします。

App.MyRoute = Ember.Route.extend({
    transaction: this.store.transaction();
})

次に、レコードを作成し、次を使用してトランザクションに追加します

var company = this.transaction.createRecord(App.Company);

最後にトランザクションをコミットまたはロールバックします

this.transaction.commit();
this.transaction.rollback();
于 2013-02-01T01:52:04.187 に答える
0

あなたの場合、トランザクションは既にコミットされているため、rollback() は解決策ではないと思います。サーバーの検証が失敗した場合でも、レコードは ArrayController コンテンツに追加されています。

私が見ることができる解決策は、次のようなもので deleteRecord 関数を使用することです:

wireObservers: function(company, router) {
 company.on('becameInvalid', function(record){
   record.deleteRecord();
 });

 company.on('didCreate', function(){
   router.transitionTo('companies.index');
 });

}))

ワークフローについて質問があります。検証エラーが発生してページを離れると、ユーザーがレコードの作成をキャンセルしたことを意味します

于 2013-02-01T22:02:39.763 に答える