灰烬:即使刷新后,模型中的某些属性也不会更改

时间:2018-11-22 15:19:41

标签: javascript html ajax model-view-controller ember.js

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

在控制器中,我一直在跟踪某些值是否已更改,如果它们已更改,则更新与其更改相关的标志,这些标志例如isChangedisCountChanged是模型的一部分用户点击“提交”按钮paramChange后的数据  调用动作,然后进行后期调用以更新相应属性更改的数据库,然后调用this.refresh()来呈现最新的模型数据。

但是问题是,一旦isChanged和/或isCountChanged从其默认值更改后,它们就不会重置为模型数据中存在的新值,例如在refresh中将这两个标志的值都应重置为false,但始终为true,我检查了setUpController钩中的值以获取这些标志的值,并确认为true。

根据我的看法,它与控制器有关,因为曾经在控制器中使用的任何值都不会重置为refresh之后的新值。

请帮助我,我花了很多时间在此之前一无所获,请告知是否需要其他信息。

Ember版本:2.6

1 个答案:

答案 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(),则始终更新控制器数据。