EmberJS:引导模式拒绝重新打开,由于记录没有被正确删除?(EmberJS: bootstrap

2019-10-29 14:26发布

目标:

那我真的想在这里完成的事情是获得一个了解如何使用模型记录干净的工作。 在这种特殊情况下,这些记录是一种“一次性的”的。 如果模态而不保存关闭,然后他们是为了从内存中清除......而一旦记录保存到服务器上还有没有必要继续再记录存储客户端。

描述:

我创建了一个过渡到“支付”的路线,这使得自举模式内的按钮操作。

这条路线将创建一个“支付”的记录,也可拉“债务”列表付款可应用于。

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

当支付按钮点击一次,就“应该”创建一个新的支付记录......而是出现错误,因为此前的纪录还没有被正确地清除?

我成功地重建问题在这个JSBin

我不是创造和正确删除记录?

边注:

我已经设置console.log()我所有的路线和控制器方法......我注意到, setupController不会触发第二个开放的尝试....也是我控制器CP的和观察员在初始化理线触发多次.. 。我不知道是否是造成这个问题没有?

Answer 1:

我不认为你真的想“删除”的记录。 你想要做什么是回滚到任何更改,然后卸载它。 我会做这在您的willTransition挂钩的航线所以没有不管你怎么离开的路线,该模型将被卸载。

码:

willTransition: function(transition) {
  var model = this.currentModel;
  var debt_list = get(this, 'debt_list');
  var store = this.store;

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

UPDATE:卸载从余烬运行循环记录给绑定到这些记录的任何意见,从下他们翻录模式之前要拆了一个机会,这是非常重要的。 这就是为什么模型产权处置是内进行Ember.run.once()

另一种看法是,你应该能够揭开序幕debt_list在请求model采用挂钩RSVP.hash 。 所以,把他们放在一起你的路线看起来应该像下面这样:

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 这里所以它的工作完美,模型正确地从商店中移除。



Answer 2:

这个问题似乎是this.store.find('debt', { account_id: 36, page_size: 100, page_number: 1 })

因为一旦查询完成后,控制器绑定到数组,当它改变了所有的观察者被解雇烬数据将加载项进店。

所以setDebtPayments获取调用,(前setupController),试图做model.set('payment_debts', paymentDebts); 这在该点已被破坏。

我设法解决这个问题通过创建一个新的支付记录时(suboptimaly) removeModal被调用。

另一种方法,是检查是否存在由控制器装饰的典范,做任何事的之前: http://jsbin.com/ziket/8



文章来源: EmberJS: bootstrap modal refuses to re-open due to record not being correctly deleted?