我是EmberJS的新手,并且面临模型数据更新的问题
控制器:
export default Ember.Controller.extend({
queryParams: ['jobid'],
jobid: null,
currentCount: null,
actions: {
onOffToggle(e) {
var isChanged = this.get('model.b.isChanged');
this.set('model.b.enable', e.target.checked);
this.set('model.b.isChanged', !isChanged);
console.log(this.get('model.b.isChanged'))
},
iterationCountChange() {
var currentCount = this.get('currentCount');
var isCountChanged =
(currentCount != this.get('model.b.count')) ? true : false;
this.set('model.b.isCountChanged', isCountChanged);
}
}});
路线:
export default Ember.Route.extend({
ajax: Ember.inject.service(),
beforeModel: function (transition) {
this.jobid = transition.queryParams.jobid;
},
model(){
return Ember.RSVP.hash({
a: this.store.queryRecord('a', {jobid: this.get("jobid")}),
b: this.store.queryRecord('b', {id: this.get("jobid")})
});
},
setupController: function(controller, model) {
this._super(controller, model)
controller.set('currentCount', model.b.get('iterationCount'))
},
actions: {
paramChange(a, b)
Ember.$.ajax({
url: "/rest/test",
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
b: b,
a: a
})
}).then(response => {
this.refresh();
})
},
error(error, transition) {
if (error.errors[0].status == 404) {
return this.transitionTo('not-found', { queryParams: {'previous': window.location.href}});
}
}
}
});
在控制器中,我一直在跟踪某些值是否已更改,如果它们已更改,则更新与其更改相关的标志,这些标志例如isChanged
和isCountChanged
是模型的一部分用户点击“提交”按钮paramChange
后的数据
调用动作,然后进行后期调用以更新相应属性更改的数据库,然后调用this.refresh()
来呈现最新的模型数据。
但是问题是,一旦isChanged
和/或isCountChanged
从其默认值更改后,它们就不会重置为模型数据中存在的新值,例如在refresh
中将这两个标志的值都应重置为false,但始终为true,我检查了setUpController
钩中的值以获取这些标志的值,并确认为true。
根据我的看法,它与控制器有关,因为曾经在控制器中使用的任何值都不会重置为refresh
之后的新值。
请帮助我,我花了很多时间在此之前一无所获,请告知是否需要其他信息。
Ember版本:2.6
答案 0 :(得分:0)
从文档中
刷新此路线和所有子路线的模型,触发 beforeModel,model和afterModel以类似于 从其他路径过渡时输入路径。目前 路由参数(例如article_id)将传递到相应的 模型挂钩,如果返回了不同的模型,则setupController和 相关的路线挂钩也会重新触发。
因此,如果您的模型数据不变,则不会调用setupController()
。我的方法是有一个自定义方法来用模型数据更新控制器。然后,我从model()
钩子(对于this.refresh()
)和setupController()
调用此方法。
model() {
return this.store.query(....).then(data => this.updateControllerData(data));
}
setupController(controller, model) {
this._super(...arguments);
this.updateControllerData(data);
}
updateControllerData(data = {}) {
if (!this.controller) {
return;
}
this.controller.setProperties(data);
}
请注意,如果未触发setupController()
,则始终更新控制器数据。