2013-04-30 3 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, область автоматически обновится, но я не знаю, как это сделать в этой ситуации. Как я могу получить доступ к этой области?

Если есть другие, более эффективные (или более Угловые) способы сделать это, что это такое?

ответ

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

В своем первом предложении, вы имели в виду контроллеры вместо моделей? –

+0

Я думаю, что это было бы разумным решением, если бы у меня был только один объект, но на самом деле я получил около 100-200 из них. Будет тест, но я предполагаю, что это ухудшит производительность. –

Смежные вопросы