2015-12-12 45 views
0

大約3個星期前我開始使用AngularJS,並開始編寫一個簡單的應用程序,它從外部庫(OnReceiveMessage)獲取異步數據,然後(使用Angular)編輯範圍,以便顯示消息並執行其他操作甚至在此消息中回覆。 首先,我開始將對象聲明爲應用程序控制器,並且它可以工作,但這是一團糟,這不是正確的做法。 我的問題是:我怎樣才能啓動這個異步客戶端(通過網絡套接字通信),並將這個庫的外部函數(發送和異步接收)轉換成Angular來做它的東西(範圍,回覆等...)角度如何捕獲外部異步第三方回調函數?

external.js

Example: 
var client = new ExtClient({params}); //not setting callbacks 
Client.onMessageArrived = myCallbackHandler; 
var message = new ExtMessage("Hi there"); 
Client.send(message); 
function myCallbackHandler(message) { 
    console.log("onMessageArrived"); 
} 

app.js

var app = angular.module('myApp', ['connectionService']); 
app.controller('MainController', [ '$scope', 
    function($scope) { 
     //I want to catch the myCallbackHandler function async with the message 
     //and use the client.send(message) with the response... 
     $scope.messageTable.push({message.id, message.value}); //messageTable is bind in the view to create a table 
}]); 

回答

1

您也可以考慮使用$廣播(應用程序的不同元素之間的通信),$發出()和$的(),$上的範圍或$ rootScope。更多:

https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope

http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

+0

太棒了,謝謝! 這有助於很多,特別是當一個對象需要更新和事件掛鉤被清除...並保持與javascript的異步本質的連貫性我想知道,是否有另一條路徑優雅呢?就像在普通的js中一樣,如果新對象不會觸發新事件,我該如何處理呢? – dlubrano

1

這是您要創建的服務的情況。

angular.module('myApp', ['connectionService']) 
    .factory('messageService', function() { 
     var client = new ExtClient({ 
      // set your params 
     }); 

     return { 
      listen: function(event, callback) { 
       /* code to register a callback on an event */ 
       client[event] = callback; 
      }, 
      push: function(id, value) { 
       /* code to push a message */ 
       client.send(new ExtMessage(message)); 
      } 
     }; 
    }) 
    .controller('MainController', ['messageService' function(messageService) { 
     messageService.listen('onMessageArrived', function(message) { 
      console.log("onMessageArrived"); 
     }); 
     messageService.push('some id', 'some message'); 
    }]); 
+0

這是非常接近成爲一個完整的答案,一些丟失的圓括號旁邊,但我的外部庫不配合。當我調用client.eventhandler時,它期望某種選項如「告訴我此事件發生時的回調函數」如此: client.onMessageArrived = myOnMessageArrivedHandler 位於「listen」內部。但是當我運行代碼時,控制器中的控制檯從不記錄,但事件在工廠中被觸發,因爲如果我編寫內聯函數而不是回調函數,它會執行它。你有什麼建議嗎? – dlubrano

+0

不瞭解你的外部圖書館,很難說出發生了什麼。如果我正在解決這個問題,我會使用Chrome Inspector,單擊Source選項卡,打開定義您的MainController的文件,並在回調函數中設置斷點。然後重新加載應用程序,它應該在您設置的中斷點處凍結。從那裏,你可以檢查關閉,並在控制檯進行一些測試,找出問題所在。外部庫可能無法訪問全局範圍,即'window',因此無法訪問'console'。 –

相關問題