2014-06-20 3 views
1

현재는 $ scope.newMsg 변수에 긴 폴링 결과를 푸시 할 수 있지만 $ scope.messages.push (msg) 메시지 목록에 추가하고 싶습니다.AngularJS Long Polling - 결과를 목록에 밀어 넣으십시오.

이 내 현재 app.js이다 : 나는 newMessagePoller에 컨트롤러를 통과 시도

var messageApp = angular.module('messageApp', ['ngResource']); 
messageApp.run(function(newMessagePoller) {}); 

messageApp.factory('messagesService', function($resource) { 
    return $resource('/myapp/resources/message/all', {}, { 
     query: {method: 'GET', isArray: true} 
    }); 
}); 

messageApp.factory('newMessagePoller', function($http, $timeout) { 
    var data = {response: {}}; 
    var poller = function() { 
     $http.get('/myapp/newmsg').then(function(r) { 
      data.response = r.data; 
      $timeout(poller, 1); 
     }); 
    }; 
    poller(); 
    return {data: data}; 
}); 

messageApp.factory('createMessageService', function($resource) { 
    return $resource('/myapp/resources/message', {}, { 
     create: {method: 'POST'} 
    }); 
}); 

messageApp.factory('messageService', function($resource) { 
    return $resource('/myapp/resources/message/:id', {}, { 
     show: {method: 'GET'}, 
     update: {method: 'PUT', params: {id: '@id'}}, 
     delete: {method: 'DELETE', params: {id: '@id'}} 
    }); 
}); 
messageApp.controller('messageCtrl', function($scope, newMessagePoller, createMessageService, messagesService, messageService) { 
    $scope.messages = messagesService.query(); 
    $scope.newMsg = newMessagePoller.data; 

    $scope.newMessage = function() { 
     var newEntry = createMessageService.create($scope.message); 
     $scope.messages.push(newEntry); 
    }; 

    $scope.deleteMessage = function(msg) { 
     messageService.delete({id: msg.id}); 
     $scope.messages.splice($.inArray(msg, $scope.messages), 1); 
    }; 

    $scope.updateMessage = function(message) { 
     messageService.update(message); 
    }; 
}); 

:

내 접근 방식이 잘못 생각
messageApp.factory('newMessagePoller', function($http, $timeout, messageController) { 
    var data = {response: {}}; 
    var poller = function() { 
     $http.get('/basic-angularjs-ee/newmsg').then(function(r) { 
      data.response = r.data; 
      $timeout(poller, 1); 
     }); 
    }; 
    poller(); 
    messagePoller.pushNewMessage(data.response); 
}); 
... 

$scope.pushNewMessage(msg) { 
    $scope.messages.push(msg); 
} 

, 어떤 도움이 많이 주시면 감사하겠습니다.

** 근무 코드 ** 내가 작업 코드를 얻으려면 다음과 같이 변경해야했습니다 (감사 domakas) :

messageApp.factory('newMessagePoller', function($http, $timeout) { 
    var data = {data: ''}; 
    var poller = function() { 
     $http.get('/myapp/newmsg').then(function(r) { 
      data.data = r.data; 
      $timeout(poller, 1); 
     }); 
    }; 
    poller(); 
    return data; 
}); 

json으로 구조의 데이터 속성에 대한 응답으로 지정되어 있습니다.

$scope.$watch(
     function() { return newMessagePoller.data; }, 
     function(newMsg, oldMsg) { 
      $scope.newMsg = newMsg; 
      $scope.messages.push(newMsg); 
     } 
); 

컨트롤러에 $ watch 함수가 추가되었습니다.

답변

4

그것은 당신의 궁극적 인 목표는 여기에 무엇을 이해하기 어렵습니다,하지만 난 당신이 컨트롤러에 newMessagePoller에 대한 감시자를 생성하고이 메시지를 추진해야한다고 생각 :

$scope.$watch(function() { return newMessagePoller.data; }, function(new, old) { 
    if(new !== old) { 
     $scope.messages.push(new); 
    } 
}); 
+0

basicly 서버가 새와 긴 폴링 요청을 채 웁니다 메시지 (json). 모든 작업을 수행하려면 목록에 새 메시지를 추가하십시오. 정확하게 오래 된 무엇입니까? – dngfng

+0

이 시계는 지속적으로'newMessagePoller.data'의 값을 확인하고 콜백 함수 변수'new'는'newMessagePoller.data'의 새로운 값이고'old'는 이전의'newMessagePoller.data' 값입니다. 'if' 문은 실제로 변경된 값을 검사합니다. – domakas

+0

컨트롤러에 추가했지만 작동하지 않는 것 같습니다. $ scope. $ watch ( function() {return newMessagePoller.data;}, function (newMsg, oldMsg) { $ scope.newMsg = msg; $ scope.messages.push (msg.response); } ); – dngfng