2016-12-14 78 views
0

我有以下控制器:訂閱一個DS.Model事件控制器

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

但是從modeldidDeletePost刪除post不起作用,因爲post參數是InternalModel,而不是DS.Model

我該如何做到這一點?

由於這樣做似乎並不容易,我猜應該有更好的方法來實現這種計時器嗎?

回答

0

其實你不需要從model刪除帖子。

請查看我公司提供的玩弄:https://ember-twiddle.com/25de9c8d217eafe03aea874f8eefb0fd

+0

謝謝,但這只是因爲你找到了所有的帖子,這是有點特定的。作爲一個例子,它不適用於'query'。 – louiscoquio

+0

@louiscoquio我更新了我的小提琴。它也適用於查詢' –

+0

你是對的,對不起!它在我的情況下不起作用:我在路由模型中調用'#toArray'來稍後從控制器添加一些帖子。另外,我還需要在'didDeletePost'回調函數中使用'post'做一些其他的事情。 – louiscoquio

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 */ 
+0

在我的情況下,我需要在控制器中進行回調,所以你的解決方案似乎在'Post#markForDelete'中包裝'Post#one('didDelete')'',一旦'didDelete'發送,返回一個Promise解析。由於它與我的實現基本相同,所以我期望我的工作:'#one'回調中的'post'參數應該是'Post'而不是'InternalModel'。我對嗎?你同意嗎? – louiscoquio