【问题标题】:AngularJS UI-Router scoping issuesAngularJS UI-Router 范围问题
【发布时间】:2013-09-23 10:44:55
【问题描述】:

我认为 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 手动刷新页面,它会再次开始工作,但导航到其他页面会停止一切工作。

我认为这是一个范围界定问题,因为当我导航到另一个页面时,会议对象仍然是从前一页填充的。

【问题讨论】:

    标签: angularjs signalr angularjs-scope


    【解决方案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 方法接受承诺并解决它:

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

    【讨论】:

    • 您似乎在 SignalR 实现中进行数据检索。这可能更适合使用 $http 或 ng-resource 来完成。 SignalR 旨在用于客户端和服务器之间的消息传递(反之亦然)。
    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多