从服务器推送websocket数据后,Angularjs模型发生了变化

Pas*_*yer 8 javascript websocket socket.io angularjs

我试图在从服务器推送websocket之后改变我的角度模型.$scope.contacts每次服务器提供新数据时,如何更改值?

我不确定是否可以使用$apply.我知道我可以访问DOM元素检索范围然后更改值,但应该有更好的解决方案!

我真的对从外部更新角度模型而不创建角度模块的解决方案感兴趣,因为我正在使用发出更改事件的相对数据源.有没有简单的方法可以像Backbone.js那样做,你可以说:

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

我想要的angularjs是这样的:

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

datasource changed -> function () {
    MyController.set('contacts', 'value'); // change angular scope property
}
Run Code Online (Sandbox Code Playgroud)

Max*_*ach 11

看看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);
            }
          });
        })
      }
    };

  }]);
Run Code Online (Sandbox Code Playgroud)

和控制器使用它:

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

    socket.emit('register')

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

}]);
Run Code Online (Sandbox Code Playgroud)