1

angular ui-router のスコーピングの問題だと思いますが、よくわかりません。

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-router で正常に機能しますが、ページが最初に読み込まれたときのみです。ここに私のルーティング設定があります:

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/meeting/3) を読み込むと、すべての signalR メソッドが呼び出され、MeetingController の会議モデルが読み込まれ、データがビューに表示されます。
別の状態 (つまり、mysite/meeting/4) に移動すると、signalR メソッドがまだ呼び出され、会議モデルが読み込まれますが、その後消えてしまいます。F5 キーを押してページを手動で更新すると、再び機能し始めますが、別のページに移動するとすべてが機能しなくなります。

別のページに移動すると、会議オブジェクトがまだ前のページから取り込まれているため、スコープの問題だと思います。

4

1 に答える 1

1

シングルトンの signalR サービスにコールバックを登録する方法が非常に煩雑になり、ui-router ではうまく機能しないことがわかりました。

promise を使用するように切り替えたところ、すべてがよりエレガントに機能するようになりました。基本的に、signalR ハブには、必要なオブジェクトを返すメソッドがあります。

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

次に、コントローラーで promise を作成し、解決のために signalR サービスに渡します。

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

私の signalR サービスの getMeetingsForMember メソッドは、promise を受け入れて解決します。

getMeetingsForMember = function (memberId, deferred) {
    deferred.resolve(signalRService.hub.server.getMeetingsForMember(memberId));
}
于 2013-09-26T01:58:35.557 に答える