不同选项卡中控制器之间的 Angularjs 通信
Angularjs communication between controllers in different tabs
我有控制器A,它将一些数据发送到共享服务,控制器B应该读取该数据。问题是控制器 B 与控制器 A 位于不同的页面上(在同一网站上(,即我做 smth。在控制器 A 上,单击按钮(将数据发送到服务(并打开另一个页面,其中控制器 B 应从服务读取数据。但是什么也没发生,所以我的问题是不同页面上的控制器可以这样通信吗?
以下是我尝试这样做但没有运气的方法:
服务:
publicApp.angularModule.service('controllerCommunicationService', function ($rootScope) {
var communicationService = {};
communicationService.data = null;
communicationService.setDataForBroadcast = function(data) {
this.data = data;
this.broadcastData();
};
communicationService.broadcastData = function() {
$rootScope.$broadcast('handleBroadcast');
};
return communicationService;
});
控制器 A 的相关部分:
publicApp.angularModule.controller('PublicRoutinesCtrl', function ($scope, $rootScope, routinesService, controllerCommunicationService, bootstrapCarouselService) {
$scope.goToNextScreen = function() {
var currentIndex = bootstrapCarouselService.getcurrentSlideIndex();
controllerCommunicationService.setDataForBroadcast($scope.items[currentIndex].Routine.RoutineId);
};
控制器B的相关部分:
$rootScope.$on('handleBroadcast', function () {
console.log("TEST");
$http.post("/EditWorkout/PostRoutineId", { routineId: controllerCommunicationService.data })
.success(function() {
console.log("success");
})
.error(function (responseData) {
console.log("Error !" + responseData);
});
});
甚至console.log("TEST");
也没有被解雇。
根据您的问题
我的问题是不同页面上的控制器可以以这种方式进行通信吗 ?
答案是否定的。 Angular和javascript不是这样设计的。
但是,如果您的意思是在同一页面上使用不同的视图,那么是的,您可以使用服务。 服务是单例,当保持在同一页面上时,它们的数据会跨控制器保存。
如果你真的想将数据从一个页面发送到另一个页面,你的选择是通过查询字符串(在url上(或发布数据来完成,或者如果你只支持现代浏览器,那么你可以使用客户端本地存储(http://www.w3schools.com/html/html5_webstorage.asp(
那么,还有另外两种方式可以在选项卡之间进行通信。通过具有全局域的cookie,不建议这样做,因为不安全。
或者用帖子消息:
https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage?redirectlocale=en-US
演示:
http://html5demos.com/postmessage2
和浏览器支持:
http://caniuse.com/#feat=x-doc-messaging
我假设当您在选项卡之间跳转时,不幸的是,您正在重新加载整个页面 - 不要这样做。相反,请使用 routeProvider 来设置一个很好的路由。
var App = angular.module('App', []);
App.config(function($routeProvider) {
$routeProvider.when('/tab1', {templateUrl: 'views/tab1.html'});
$routeProvider.when('/tab2', {templateUrl: 'views/tab2.html'});
$routeProvider.otherwise({redirectTo: '/tab1'});
});
然后,即使您切换选项卡,其余代码也将工作并保留服务存储的共享数据。如果您不想使用该$routeProvider
请在服务中编写一个逻辑,以使用 localStorage、indexDB 等来持久化数据。
据我所知,您正在使用Angular控制器和服务,那么使用$routes也应该不是问题。
$rootScope.$broadcast
是控制器之间完全可以接受的通信方式,但由于您跨页面使用,因此它不起作用。这是因为当您执行broadcast
调用时,另一个控制器未加载,因此on
方法不会被触发。但是,由于您的服务具有属性data
您可以通过将服务注入另一个控制器并访问它data
属性来直接访问它。
controllerCommunicationService.data
随时随地,因此无需使用on
方法。
如 @Anton 所述,您还可以使用 querystring''url fragements 和客户端存储来传递数据。
- angularjs中$cookiestore和$cookies之间的差异
- 使用服务(AngularJS)在控制器之间共享数据
- AngularJS中的页面之间共享数据返回空
- AngularJS$inject-点和括号访问器之间的差异
- 测试页面之间的AngularJS行为
- angularjs 中 $window.location.reload() 和 $route.reload() 之间的区
- Angularjs事件与发布/订阅指令之间的通信
- 使用Angularjs在两个不同页面的控制器之间共享数据
- 在使用AngularJS时,我应该在$apply和$watch之间使用哪个
- AngularJS和Thymelaf之间的冲突
- 访问angularJS中页面之间的控制器
- angularjs计算开始时间和当前时间之间的时间差
- 在angularJS中使用模态窗口时,在控制器之间共享对象数组
- AngularJS:如何在控制器之间传递变量
- 如何在 Angularjs 中的交叉模块之间共享数据
- 在OnsenUI+AngularJS+PhoneGap中的控制器之间传递数据
- 使用 AngularJS 在控制器之间传递变量
- angularjs 中 ng-repeat 和 collection-repeat 之间的区别
- angularjs 中控制器和指令之间的通信
- 处理服务和控制器之间AngularJS Promises的推荐方法