2013-04-30 50 views
1

我正在運行一個AngularJS應用程序,該應用程序包含用於實時更新模型的Pusher。當推送者在工廠定義中發送AngularJS資源的更新數據時,我想在範圍中觸發一個動作。

我有一個資源定義如下:

TS.app.factory "Object", ($resource) -> 
    Object = $resource("objects/:publicToken", {publicToken: "@public_token"}, {update: {method: "PUT"}}) 

    # Checks for updates to object data via Pusher. 
    Object::watch = -> 
    channelName = "private-12345" 

    # See if we've already subscribed to this channel. 
    channel = Namespace.pusher.channel(channelName) 

    # If not, subscribe. 
    channel ||= Namespace.pusher.subscribe(channelName) 

    # Update data if we get new info from pusher. 
    channel.bind "updated info", (data) => 
     # THIS GETS RUN WHEN PUSHER SENDS UPDATED DATA. 
     for key, value of data 
     this[key] = value 
     # TRIGGER ACTION HERE 

我想在此資源的範圍這裏設置變量。我知道像$ get這樣的方法,範圍會自動更新,但在這種情況下我不知道該怎麼做。我怎樣才能在這裏訪問範圍?

如果還有其他更好的(或更多的Angular-y)方法來做到這一點,它們是什麼?

回答

3

你絕對不希望你的服務知道你的模型或直接訪問它們。這聽起來像你想在服務上使用觀察者模式,並讓任何關心獲取通知的控制器訂閱你的服務。

這裏有一個簡單的例子:http://jsfiddle.net/langdonx/sqCZz/

HTML

<div ng-app="app" ng-controller="testController"> 
    <div ng-repeat="notification in notifications">{{notification}}</div> 
</div> 

的JavaScript

angular.module('app', []) 
    .factory('TestService', function() { 
    var _subscribers = []; 

    setInterval(function() { 
     // every 1 second, notify all subscribers 
     console.log(_subscribers); 
     angular.forEach(_subscribers, function (cb) { 
      cb('something special @ ' + new Date()); 
     }); 
    }, 2500); 

    return { 
     subscribe: function (cb) { 
      _subscribers.push(cb); 
     } 
    }; 
}) 
    .controller('testController', function ($scope, TestService) { 
    $scope.notifications = ['nothing yet']; 

    TestService.subscribe(function (notification) { 
     $scope.$apply(function() { 
      $scope.notifications.push('got ' + notification); 
     }); 
    }); 
}); 
+1

在你的第一句話,你的意思是控制器,而不是模型? – 2013-04-30 21:06:36

+0

我認爲如果我只有一個對象,這將是一個合理的解決方案,但實際上我已經得到了大約100-200個。將測試,但我猜測這會惡化性能。 – 2013-04-30 22:04:00