Twitter bootstrap EmberJS:由于记录未正确删除,引导模式拒绝重新打开? 目标是:

Twitter bootstrap EmberJS:由于记录未正确删除,引导模式拒绝重新打开? 目标是:,twitter-bootstrap,ember.js,ember-data,Twitter Bootstrap,Ember.js,Ember Data,我在这里真正想做的是理解如何干净地使用模型记录。在这种特殊情况下,这些记录是“一次性”的。如果模式关闭而不保存,则意味着它们将从内存中清除。。。记录保存到服务器后,也不需要将重新记录保存到客户端 说明: 我创建了一个按钮操作,它转换为“付款”路径,在引导模式中呈现 此路径创建一个“付款”记录,并提取可用于付款的可用“债务”列表 App.PaymentRoute = Ember.Route.extend({ model: function() { console.log('( Rout

我在这里真正想做的是理解如何干净地使用模型记录。在这种特殊情况下,这些记录是“一次性”的。如果模式关闭而不保存,则意味着它们将从内存中清除。。。记录保存到服务器后,也不需要将重新记录保存到客户端

说明:

我创建了一个按钮操作,它转换为“付款”路径,在引导模式中呈现

此路径创建一个“付款”记录,并提取可用于付款的可用“债务”列表

App.PaymentRoute = Ember.Route.extend({
  model: function() {
    console.log('( Router: Model Hook )--------------------)');
    return this.store.createRecord('payment');
  },
  afterModel: function() {
    console.log('( Router: AfterModel Hook )--------------------)');
    var route = this;
    return Ember.RSVP.hash({
      debt_list: this.store.find('debt', { account_id: 36, page_size: 100, page_number: 1 })
    }).then(function(hash) {
      route.setProperties({
        account_id: 36,
        debt_list: hash.debt_list
      });
    });
  },
  setupController: function(controller, model) {
    console.log('( Router: SetupController Hook )--------------------)');
    this._super(controller, model);
    controller.setProperties({
      account_id: this.get('account_id'),
      debt_list: this.get('debt_list')
    });
  },
});
关闭模式应删除当前记录并转换回索引

actions: {
    removeModal: function() {
      this.currentModel.deleteRecord();
      this.transitionTo('index');
      return true;
    }
  }
当第二次点击付款按钮时,它“应该”创建一个新的付款记录。。。但是会发生错误,因为之前的记录没有被正确清除

我成功地重新创建了此问题

我是否未正确创建和删除记录

旁注:


我已在所有路由和控制器方法上设置了
console.log()。。。我注意到,
setupController
在第二次打开尝试时没有启动。。。。此外,在初始化过程中,我的控制器cp和观察器会多次触发。。。我不知道这是否是问题的原因?

问题似乎是
this.store.find('debt',{account\u id:36,page\u size:100,page\u number:1})

因为一旦查询完成,余烬数据将加载项到存储中,并且控制器绑定到该数组,当它更改时,所有观察者都被激发

因此,
setDebtPayments
被调用(在setupController之前),试图执行
model.set('payment\u debtes',paymentdeborts)此时已被销毁

I(次优)在调用
removemodel
时创建新的付款记录


另一种选择是,在对控制器进行任何操作之前,检查是否有一个模型经过修饰:

问题似乎是
this.store.find('debt',{account\u id:36,page\u size:100,page\u number:1})

因为一旦查询完成,余烬数据将加载项到存储中,并且控制器绑定到该数组,当它更改时,所有观察者都被激发

因此,
setDebtPayments
被调用(在setupController之前),试图执行
model.set('payment\u debtes',paymentdeborts)此时已被销毁

I(次优)在调用
removemodel
时创建新的付款记录


另一种选择是,在对控制器进行任何操作之前,检查是否有一个模型经过修饰:

问题似乎是
this.store.find('debt',{account\u id:36,page\u size:100,page\u number:1})

因为一旦查询完成,余烬数据将加载项到存储中,并且控制器绑定到该数组,当它更改时,所有观察者都被激发

因此,
setDebtPayments
被调用(在setupController之前),试图执行
model.set('payment\u debtes',paymentdeborts)此时已被销毁

I(次优)在调用
removemodel
时创建新的付款记录


另一种选择是,在对控制器进行任何操作之前,检查是否有一个模型经过修饰:

问题似乎是
this.store.find('debt',{account\u id:36,page\u size:100,page\u number:1})

因为一旦查询完成,余烬数据将加载项到存储中,并且控制器绑定到该数组,当它更改时,所有观察者都被激发

因此,
setDebtPayments
被调用(在setupController之前),试图执行
model.set('payment\u debtes',paymentdeborts)此时已被销毁

I(次优)在调用
removemodel
时创建新的付款记录


另一个选项是,在对控制器进行任何操作之前,检查是否有一个模型经过控制器修饰:

我认为您实际上不想“删除”该记录。您要做的是回滚对它的任何更改,然后卸载它。我会在你的
willTransition
中这样做,这样无论你如何离开路线,模型都会被卸载

代码:

更新:从余烬运行循环中卸载记录非常重要,以便在将模型从其下剥离之前,让绑定到这些记录的任何视图有机会被删除。这就是在
Ember.run.once()中执行模型处理的原因

另一个观察结果是,您应该能够使用
RSVP.hash
模型中启动
debt\u列表
请求。因此,将所有这些放在一起,您的路线应该如下所示:

var get = Ember.get, set = Ember.set;

App.PaymentRoute = Ember.Route.extend({
  model: function(params, transition, queryParams) {
    return Ember.RSVP.hash({
      content: this.store.createRecord('payment'),
      debt_list: this.store.find('debt', { account_id: 36, page_size: 100, page_number: 1 })
    });
  },

  setupController: function(controller, hash) {
    if (controller && hash) {
      controller.setProperties(hash);
      set(controller, 'account_id', 36);
    }
  },

  actions: {

    willTransition: function(transition) {
      var hash = this.currentModel;
      var store = this.store;

      // tell controller to reset/cleanup - you should set any
      // model related properties ie 'content'/'model' and 'debt_list'
      // to null/default values.
      this.controller.reset();

      if (hash) 
        // dispose of models after views have been finalised 
        Ember.run.once(function() {
          hash.content.rollback();
          store.unloadRecord(hash.content);
          hash.debt_list.forEach(function(debt) {
            debt.rollback();
            store.unloadRecord(debt);
          });
        });
      }
    }
  }
});

我已经更新了您的JSBin,使其工作正常,模型已从存储中正确删除。

我认为您实际上不想“删除”该记录。您要做的是回滚对它的任何更改,然后卸载它。我会在你的
willTransition
中这样做,这样无论你如何离开路线,模型都会被卸载

代码:

更新:从余烬运行循环中卸载记录非常重要,以便在将模型从其下剥离之前,让绑定到这些记录的任何视图有机会被删除。这就是在
Ember.run.once()中执行模型处理的原因

另一个观察结果是,您应该能够使用
RSVP.hash
模型中启动
debt\u列表
请求。所以把所有这些放在一起,你的路线应该是
var get = Ember.get, set = Ember.set;

App.PaymentRoute = Ember.Route.extend({
  model: function(params, transition, queryParams) {
    return Ember.RSVP.hash({
      content: this.store.createRecord('payment'),
      debt_list: this.store.find('debt', { account_id: 36, page_size: 100, page_number: 1 })
    });
  },

  setupController: function(controller, hash) {
    if (controller && hash) {
      controller.setProperties(hash);
      set(controller, 'account_id', 36);
    }
  },

  actions: {

    willTransition: function(transition) {
      var hash = this.currentModel;
      var store = this.store;

      // tell controller to reset/cleanup - you should set any
      // model related properties ie 'content'/'model' and 'debt_list'
      // to null/default values.
      this.controller.reset();

      if (hash) 
        // dispose of models after views have been finalised 
        Ember.run.once(function() {
          hash.content.rollback();
          store.unloadRecord(hash.content);
          hash.debt_list.forEach(function(debt) {
            debt.rollback();
            store.unloadRecord(debt);
          });
        });
      }
    }
  }
});