AngularJS UI路由器范围问题
我认为angular ui router存在范围界定问题,但我不太确定AngularJS UI路由器范围问题,angularjs,signalr,angularjs-scope,Angularjs,Signalr,Angularjs Scope,我认为angular ui router存在范围界定问题,但我不太确定 angular.module('Meeting').controller('MeetingController', ['$scope', 'signalRService', '$stateParams', function ($scope, signalRService, $stateParams) { $scope.setMeetings = function(meetings) { $scope.meetings
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;
}]);
基本上,我的模块被注入了信号服务,我在上面注册了一个回调来设置会议。我的视图上有一个按钮,告诉信号服务获取会议,然后调用我刚刚注册的回调。
现在,所有这些都可以在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/meeting/3)时,将调用所有信号器方法,填充MeetingController中的会议模型,并在视图中显示数据。当我导航到另一个状态(即mysite/meeting/4)时,仍然会调用signar方法,并填充会议模型,但随后就消失了。如果我用F5手动刷新页面,它会再次开始工作,但导航到其他页面会停止一切工作
我认为这是一个范围问题,因为当我导航到另一个页面时,meetings对象仍然是从上一个页面填充的。我向singleton Signal服务注册回调的方式变得非常麻烦,并且与ui router不兼容,正如我发现的那样 我改用承诺,一切都变得更加优雅。基本上,我的信号集线器上有一个方法,返回我想要的对象:
public List<Meeting> GetMeetingsForMember(int memberId)
{
return _meetingRepository.GetAllUpcomingMeetingsForMember(int memberId);
}
my Signal服务上的getMeetingsForMember方法接受承诺并解决它:
getMeetingsForMember = function (memberId, deferred) {
deferred.resolve(signalRService.hub.server.getMeetingsForMember(memberId));
}
我用singleton signalR服务注册回调的方式变得非常麻烦,而且我发现它不能很好地使用ui路由器 我改用承诺,一切都变得更加优雅。基本上,我的信号集线器上有一个方法,返回我想要的对象:
public List<Meeting> GetMeetingsForMember(int memberId)
{
return _meetingRepository.GetAllUpcomingMeetingsForMember(int memberId);
}
my Signal服务上的getMeetingsForMember方法接受承诺并解决它:
getMeetingsForMember = function (memberId, deferred) {
deferred.resolve(signalRService.hub.server.getMeetingsForMember(memberId));
}
您似乎正在信号器实现中进行数据检索。这可能更适合使用$http或ng资源来完成。SignalR用于客户端和服务器之间的消息传递(反之亦然)。您似乎正在SignalR实现中进行数据检索。这可能更适合使用$http或ng资源来完成。SignalR用于客户端和服务器之间的消息传递(反之亦然)。