10

我有控制器 A 向共享服务发送一些数据,控制器 B 应该读取该数据。问题是控制器 B 与控制器 A 位于不同的页面(在同一网站上),即我这样做。在控制器 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");没有被解雇。

4

4 回答 4

7

根据你的问题

我的问题是不同页面上的控制器可以通过这种方式进行通信吗?

答案是不。就此而言,Angular 和 javascript 并不是这样设计的。

但是,如果您指的是同一页面上的不同视图,那么可以,您可以使用服务。服务是单例的,当保存在同一页面上时,它们的数据会跨控制器保存。

如果您真的想将数据从一个页面发送到另一个页面,您的选择是通过查询字符串(在 url 上)或发布数据,或者如果您只支持现代浏览器,那么您可以使用客户端本地存储(http ://www.w3schools.com/html/html5_webstorage.asp )

于 2013-10-09T11:50:18.723 回答
5

好吧,还有其他两种方式可以在选项卡之间进行通信。通过具有全局域的 cookie,不建议这样做,因为它不安全。

或使用 postMessage:

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

于 2015-01-14T13:51:28.190 回答
3

我假设当您在选项卡之间跳转时,不幸的是您正在重新加载整个页面 - 不要那样做。而是使用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在服务中使用 then 编写逻辑来使用 localStorage、indexDB 等来持久化数据。

据我所知,您正在使用 Angular 控制器和服务,那么使用 $routes 也不应该是一个问题。:-)

于 2013-10-09T13:47:52.913 回答
1

$rootScope.$broadcast是在控制器之间进行通信的一种完全可以接受的方式,但是由于您在跨页面使用它是行不通的。这是因为当您进行broadcast调用时,未加载另一个控制器,因此它的on方法不会被触发。但是由于您的服务有一个属性data,您可以通过将服务注入另一个控制器并访问它的data属性来直接访问它

controllerCommunicationService.data随时随地你想要的所以不需要使用on方法。

正如@Anton 所解释的,您还可以使用 querystring\url 片段和客户端存储来传递数据。

于 2013-10-09T12:17:43.930 回答