2013-09-23 55 views
1

我已經有了我認爲是角度ui路由器的範圍問題,但我不太確定。AngularJS用戶界面路由器範圍問題

angular.module('Meeting').controller('MeetingController', ['$scope', 'signalRService', '$stateParams', function ($scope, signalRService, $stateParams) { 
$scope.setMeetings = function(meetings) { 
    $scope.meetings = meetings.map(function(meeting) { 
     return { 
      id: meeting.CategoryId, 
      name: meeting.MeetingName 
     }; 
    }); 
    $scope.$apply(); 
}; 

$scope.connectToSignalR = function() { 
    signalRService.connect(); 
    signalRService.registerAddMeetingsClientMethod($scope.addMeetings); 
}; 

$scope.requestMeetings = function() { 
    signalRService.requestMeetings($stateParams.departmentId); 
}; 

$scope.connectToSignalR(); 

$scope.eventId = $stateParams.eventId; 

}]); 

基本上,我的模塊注入signalR服務,我註冊一個回調來設置會議。我的視圖上有一個按鈕,用於告訴signalR服務來獲取會議,然後召集我剛剛註冊的回叫。 現在,所有這一切都與UI路由器正常工作,但只有第一次頁面加載。這裏是我的路由配置:

angular.module('Meeting') 
.config(
    ['$stateProvider', '$urlRouterProvider', 
     function($stateProvider, $urlRouterProvider) { 

      $stateProvider     
       .state("meeting", 
        { 
         url: "/meeting/:departmentId/", 
         templateUrl: '/home/meetingPage', 
         controller: "MeetingController" 
        }) 
       .state("meeting.members", 
        { 
         url: "/members/", 
         templateUrl: "/home/memberspage", 
         controller: "MeetingMemberController" 
        })     
       .state("meeting.edit", { 
         url: "/meetingedit", 
         views: { 
          'meetingtime': { 
           templateUrl: '/home/timepage', 
           controller: 'MeetingTimeController' 
          }, 
          'location': { 
           templateUrl: '/home/locationpage', 
           controller: 'MeetingLocationController' 
          } 
         } 
        }); 
     }]); 

當我加載了一個會議狀態(即mysite的/會議/ 3),所有的signalR方法被調用,在MeetingController會議模型被填充,並將數據顯示在視圖。
當我導航到另一個狀態(即mysite/meeting/4)時,signalR方法仍然被調用,並且會議模型被填充,但隨後消失。如果我用F5手動刷新頁面,它將重新開始工作,但導航到其他頁面會停止所有工作。

我在想這是一個範圍界定問題,因爲當我導航到不同的頁面時,會議對象仍然從上一頁填充。

回答

1

我正在用singleton signalR服務註冊回調的方式變得非常繁瑣,並且與ui-router無法良好配合,正如我發現的那樣。

我切換到使用承諾,並且一切工作得更加優雅。基本上,我有我的signalR集線器的方法,它返回的對象我想:

public List<Meeting> GetMeetingsForMember(int memberId) 
    { 
     return _meetingRepository.GetAllUpcomingMeetingsForMember(int memberId); 
    } 

然後,在我的控制,我創建了一個承諾,並將它傳遞給我的signalR服務解析:

var deferred = $q.defer(); 
deferred.promise.then(
    function (meetings) { 
     setMeetings(meetings); 
    } 
); 
signalRService.getMeetingsForMember(memberId, deferred); 

我signalR服務getMeetingsForMember方法接受承諾並解決它:

getMeetingsForMember = function (memberId, deferred) { 
    deferred.resolve(signalRService.hub.server.getMeetingsForMember(memberId)); 
} 
+0

你似乎做你的SignalR實現內部數據檢索。這可能更適合用$ http或ng-resource完成。 SignalR用於客戶端和服務器之間的消息傳遞(反之亦然)。 –