2015-10-21 54 views
1

我有一個基本的Ember前端應用程序,它通過初始化程序中的websocket連接到Phoenix後端。接下來,我希望能夠使用chan.push("new_msg", {body: "test"})發送消息給Phoenix頻道。Phoenix/EmberJS使用動作的Websocket訪問

顯然,我不能從初始化程序本身做到這一點,但這是'chan'定義的唯一位置,我不知道如何從另一個位置訪問它。

我希望這發生在{{input action="sendMessage()"}}的動作中,所以我嘗試了幾種方法,例如將sendMessage()函數放入初始化程序並在組件操作等中調用它。但是,無論何時我嘗試訪問初始化程序從另一個文件(反之亦然)我得到一個錯誤,說該函數沒有定義。我知道初始化器不應該以這種方式使用,我只是不知道在哪裏放置代碼,以便我可以訪問我定義的websocket連接。

與此問題相關的大部分代碼與您將在本指南中看到的內容相匹配:http://chrismcg.com/2015/07/04/teaching-ember-cli-to-talk-to-phoenix-sockets/。不幸的是,這並不包括如何從初學者的前端使用這個websocket連接。

+0

你的動作語法是錯誤的,應該是'{{input action =「sendMessage」}}' – locks

+0

是的,我一直在滑入這一個。壞習慣。謝謝。 – Nodal

回答

2

這聽起來是一項服務工作,請參閱http://guides.emberjs.com/v2.1.0/applications/services/的相應文檔。 服務將有一個chan屬性來保持信道,並且sendMessage行動,那麼你只是注入服務在正確的上下文,並做一個類似於:

{{input action=(action service.sendMessage)}} 

這是使用closure actions觸發該服務的直接行動。

+0

太棒了!這完美地解決了一切!請記住,如果我問一個快速的語法問題呢?我需要將參數(輸入內容作爲消息)傳遞給sendMessage函數,但一直未能完全弄清楚。任何想法?非常感謝! – Nodal

+0

你可以使用'(action service.sendMessage attributeName)'和'sendMessage'作爲第一個參數,它將以'attributeName'來調用。如果你設置'value = attributeName'我相信它也應該發送它? – locks

+0

完美的解決方案!再次感謝! – Nodal