订阅控制器中的DS.Model事件

时间:2016-12-14 10:03:04

标签: ember.js ember-data

我有以下控制器:

export default Controller.extend({
  /* model is an array of Posts */

  didDeletePost(post) {
    /* PROBLEM HERE : post is an InternalModel */
    this.get('model').removeObject(post);
    /* do other stuff with post */
  },

  actions: {
    markPostForDelete(post) {
      post.markForDelete(); /* starts a timer */
      post.one('didDelete', this, this.didDeletePost);
    },
    clearMarkPostForDelete(post) {
      post.clearMarkForDelete(); /* cancel a timer which will destroyRecord */
      post.off('didDelete', this, this.didDeletePost);
    }
  }
});

但是从post中的model移除didDeletePost不起作用,因为post参数是InternalModel,而不是DS.Model

我怎样才能做到这一点?

因为这样做似乎不容易,我想应该有更好的方法来实现这种计时器?

2 个答案:

答案 0 :(得分:0)

实际上,您不需要从model删除帖子。

请查看我提供的小提琴:https://ember-twiddle.com/25de9c8d217eafe03aea874f8eefb0fd

答案 1 :(得分:0)

根据我的经验以及其他人告诉我的事情,倾听事件而不是调用行动/功能可能会给你带来非常混乱的事件链(这似乎就是这个例子,至少对我而言)。

我会稍微用标志手动执行此操作(为简单起见,这是模型中的所有示例,您可能需要根据其他交互移动到控制器):

export default DS.Model.extend({


markPostForDelete() {
    this.set('marked', true).then( () => /*function in model to start timer and then call this.deleteMarked() */);
},

clearMarkPostForDelete() {
    this.set('marked', false)
},

deleteMarked() {
    if(this.get('marked')) {
        this.destroyRecord();
    }
}
}); /* end of model */