簡體   English   中英

在Ember中解決模型后,從路線觸發對控制器的操作

[英]Trigger action on controller from route after model has resolved in Ember

我對Ember並不陌生,多年來一直是骨灰級的狂熱愛好者,但對於如何處理遇到的情況我一無所知。

我正在使用PusherPusher 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM