[英]Trigger action on controller from route after model has resolved in Ember
我對Ember並不陌生,多年來一直是骨灰級的狂熱愛好者,但對於如何處理遇到的情況我一無所知。
我正在使用Pusher和Pusher Ember庫來構建某種聊天應用程序。
它的工作方式是,一個人導航到用戶帳戶頁面,並創建一個新的“對話”。 然后,一旦創建了該對話,我想訂閱一個以該對話ID動態命名的推送器通道。 我需要在控制器上定義“推送程序訂閱”。
這是我的路線(在咖啡腳本中)
App.ConversationShowRoute = Ember.Route.extend
model: (params) ->
@store.createRecord('conversation', user_id: params.user_id).save()
和我的控制器:
App.ConversationShowController = Ember.ObjectController.extend
init: ->
subscriptions = []
subscriptions[@model.get('id')] = ['newMessage']
PUSHER_SUBSCRIPTIONS: subscriptions
不幸的是,模型在這一點上還沒有解決,所以我還不知道我的@model.id
是什么,它失敗了。
對解決此問題的最佳方法有何建議?
當我在應用程序中添加ember-pusher時,我遇到了同樣的問題。 我采用的解決方案是在App命名空間中定義一個可以引用的變量。 (不理想,以后需要修復的問題)
init: function () {
this.channelName = 'presence-document-' + App.documentId + '-channel';
this.PUSHER_SUBSCRIPTIONS[ this.channelName ] = [
'pusher:subscription_succeeded', 'pusher:member_added', 'pusher:member_removed',
'client-send-status', 'client-send-message'
];
this._super();
}
第二個更清潔的選擇是嘗試與您的用戶控制器建立需求關系,但是我不確定在初始化完成后是否可以使用該關系。
App.ConversationShowController = Ember.ObjectController.extend({
needs: ['user'],
userId: Ember.computed.alias('controllers.user.id'),
init: function() {
this.PUSHER_SUBSCRIPTIONS[this.get('userId')] = ['newMessage'];
this._super(); // Maybe try putting this first if properties haven't resolved.
}
});
第三種選擇是在初始化過程中查找用戶控制器(單例)。
App.ConversationShowController = Ember.ObjectController.extend({
init: function() {
var userController = this.container.lookup('controller:user');
this.PUSHER_SUBSCRIPTIONS[userController.get('id')] = ['newMessage'];
this._super();
}
});
UPDATE
由於您需要對話ID,因此您可以觀察模型何時更改,並按ember-pusher / bindings.js的方式連接推送程序。 您將不再需要覆蓋controller.init,只需設置PUSHER_SUBSCRIPTIONS: {}
開始即可。
afterModelLoad: function() {
this.channelName = 'conversation-' + this.get('model.id');
this.PUSHER_SUBSCRIPTIONS[this.channelName] = ['newMessage'];
// From bindings.js init
var events = this.PUSHER_SUBSCRIPTIONS[this.channelName];
this.pusher.wire(this, this.channelName, events);
this.removeObserver('afterModelLoad'); /* If you only want to run once */
}.observes('model')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.