2013-04-30 2 views
1

모델의 실시간 업데이트를 위해 Pusher를 통합 한 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> 

자바 스크립트

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

나는 하나의 Object 만 가지고 있다면 이것이 합리적인 해결책이 될 것이라고 생각하지만 실제로 약 100-200 개가있다. 테스트 할 것이지만 성능이 저하 될 것이라고 생각합니다. –