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);
});
});
}
}
}
});