2015-03-02 99 views
4

我有一個連接到websocket服務器,將消息推送到我的angularJS應用程序。我在服務中收到這些消息,現在我想在gui上公佈這些數據。

angular.module("test", []) 
    .value("DATA", []) 
    .service("WSS", ["$rootScope", "DATA", function ($rootScope, DATA) { 

     //initialise websocket here 

     m_WebSocket.onmessage = function (msg) { 
      $rootScope.$apply(function() { 
       DATA = angular.fromJson(msg.data).slice(); 
      }); 

      console.debug(DATA); //gives me the expected result 
     }; 
    }]) 
    .controller("CTRL", ["$scope", "DATA", function ($scope, DATA) { 
     $scope.data = DATA;//wont update 
    }]); 

所以,據我瞭解角度我認爲它必須這樣工作,但我的數組陣列保持空。我在這裏錯過了什麼?

+0

有幾件事情,儘量少用'$ rootcope',總會有更好的辦法。另外,你不應該在服務中使用任何類型的'$ scope'。只有控制器/指令訪問$ scope。 – 2015-03-02 14:22:26

回答

3

的問題是,當你將DATA = angular.fromJson(msg.data).slice();它不影響$scope.data = DATA;可言,因爲在服務$scope.data和新DATA陣列沒有連接,它們指向不同的對象。我們說他們之間沒有任何參考。所以它也不會更新。

這很容易解決,如果你只需要改變的對象,而不是完全覆蓋對象引用的財產

angular.module("test", []) 
    .value("DATA", {values: []}) 
    .service("WSS", ["$rootScope", "DATA", function ($rootScope, DATA) { 

    //initialise websocket here 

    m_WebSocket.onmessage = function (msg) { 
     $rootScope.$apply(function() { 
      DATA.values = angular.fromJson(msg.data).slice(); 
     }); 
    }; 
}]) 

.controller("CTRL", ["$scope", "DATA", function ($scope, DATA) { 
    $scope.data = DATA; 
}]); 

然後在模板像你之前,你會使用data.values,而不是隻是data

在這種情況下$scope.data是具有屬性values的對象。當新消息來自服務器時,唯一發生變化的是DATA對象的屬性values。但在控制器$scope.data指向相同的對象,因此Angular將能夠選擇新的數據。

+0

非常感謝你,這似乎解決了我的問題:)但是,這是不好的做法,使用$ rootScope這種情況下,或者什麼是達到此目的的更好方法? – Fidel90 2015-03-02 14:24:52

+1

無論如何你需要觸發摘要。一種方法是在範圍上使用$ apply。所以你必須使用$ rootScope,因爲你沒有控制器範圍。其他選項是使用$ timeout service $ timeout(function(){DATA.values = angular.fromJson(msg.data).slice();});' – dfsq 2015-03-02 14:32:38

+0

使用$超過$ rootScope有什麼缺點嗎? – Fidel90 2015-03-02 14:54:40

相關問題