8

サーバーから Websocket をプッシュした後、Angular モデルを変更しようとしています。$scope.contactsサーバーが新しいデータを提供するたびに値を変更するにはどうすればよいですか..?

を使用して可能かどうかはわかりません$apply。DOM要素にアクセスしてスコープを取得し、値を変更できることはわかっていますが、もっと良い解決策があるはずです!

変更イベントを発行する相対データ ソースを使用しているため、角度モジュールを作成せずに外部から角度モデルを更新するソリューションに本当に興味があります。あなたが言うことができる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
}
4

3 に答える 3

11

socket.io angular サービスを見てください。

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

}]);
于 2013-02-05T09:01:24.300 に答える
2

以下のようにするだけです

 socket.onmessage = function (event) {
     scope.$apply(function(){
       // modify scope values here 
     }
    };
于 2013-02-05T08:37:49.547 に答える
1

まあ、マークされた答えは、OPが要求する「単純な方法」ではありません。これは、はるかに簡単な解決策です。

独自の JavaScript コード内の任意の場所でスコープを取得します。

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

Angular$scope変数の値を変更しますが、外部 JavaScript から変更します。

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

ここにJSFiddleがあります。

于 2013-10-24T16:25:47.917 に答える