2013-02-05 83 views
7

從服務器推送websocket後,我試圖更改我的角度模型。每當服務器提供新數據時,如何更改值如$scope.contacts?我不確定是否可以使用$apply。我知道我可以訪問DOM元素來檢索範圍,然後更改值,但應該有更好的解決方案!從服務器推送websocket數據後,Angularjs模型更改

我真的很感興趣的解決方案,從外部更新角度模型,而不創建角度模塊,因爲我使用發出變化事件的相對數據源。有沒有簡單的方法來做到這一點像Backbone.js的,你可以說:

var book = new Backbone.Model({ title: 'value' }); 
book.set("title", "A Scandal in Bohemia"); 

我理想中angularjs是一樣的東西:

function MyController($scope) { 
    $scope.contacts = []; 
} 

datasource changed -> function() { 
    MyController.set('contacts', 'value'); // change angular scope property 
} 
+2

是的,這是可能的$ apply –

+0

@Jimbo你的答案正是我已經在我的問題中描述過。我正在尋找一種更簡單的方法,但我認爲編寫我自己的工廠模塊是最好的解決方案。 –

回答

10

看socket.io角服務:

angular.module('app') 
    .factory('socket', ['$rootScope', function ($rootScope) { 

    var socket = io.connect(); 

    return { 
     on: function (eventName, callback) { 
     socket.on(eventName, function() { 
      var args = arguments; 
      $rootScope.$apply(function() { 
      callback.apply(socket, args); 
      }); 
     }); 
     }, 
     emit: function (eventName, data, callback) { 
     socket.emit(eventName, data, function() { 
      var args = arguments; 
      $rootScope.$apply(function() { 
      if (callback) { 
       callback.apply(socket, args); 
      } 
      }); 
     }) 
     } 
    }; 

    }]); 
使用它

和控制器:

angular.module('app') 
    .controller('Controller', ['$scope', 'socket', function ($scope, socket) { 

    socket.emit('register') 

    socket.on('register', function (data) { 
     $scope.data = data; 
    }); 

}]); 
+0

這是一個非常好的例子,但它不會在我的情況下工作,因爲我正在與客戶端上的集合同步數據,並且這些集合發出更改事件。我可以改變代碼來使它符合你的建議,但我真正想要的是'scope.contacts = db.collection('contacts')。find('favorites');'並設置每個角模型屬性我的收藏更新時間,然後調用此代碼。 –

+0

你在客戶端上使用哪個數據庫? find()有回調函數嗎?你能展示客戶的完整來源嗎? –

2

只是不喜歡它下面

socket.onmessage = function (event) { 
    scope.$apply(function(){ 
     // modify scope values here 
    } 
    }; 
+0

糾正我,如果我錯了,但當我已經檢索我的範圍,我可以簡單地通過'scope.variable ='value''來更改值。我的問題是關於如何以簡單的方式檢索我想要更改的範圍。 –

+0

你已經創建了一個角度服務來製作websocket請求 –

+0

+1大發現@Ajaybeniwal - 我已經將上面的代碼與能夠在你自己的JS中檢索一個元素的範圍並將它放在下面的新答案中:) – Jimbo

1

那麼,明顯的答案是肯定不如由OP要求是「簡單的方法」。這是一個更簡單的解決方案。

檢索無論您在自己的JavaScript代碼想要的範圍:

var scope = angular.element($("#elementID")).scope(); 

變化的角度$scope變量的值,但是從你的外部JavaScript:

scope.$apply(function() { 
    scope.yourArrayForExample.push({name: 'New, external value'}); 
}); 

這裏有一個JSFiddle

相關問題