10

共有サービスにデータを送信するコントローラー A と、そのデータを読み取るコントローラー B があります。問題は、コントローラー B がコントローラー A とは異なるページ (同じ Web サイト) にあることです。コントローラー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

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場合によっては、localStorage、indexDB などを使用してデータを永続化するロジックをサービスに記述して使用したくない場合があります。

私が見る限り、Angular コントローラーとサービスを使用していれば、$routes を使用しても問題はありません。:-)

于 2013-10-09T13:47:52.913 に答える
1

$rootScope.$broadcastコントローラー間で通信するための完全に受け入れられる方法ですが、ページ全体で使用しているため、機能しません。これは、broadcast呼び出しを行うときに他のコントローラーがロードされてonいないため、そのメソッドが起動されないためです。ただし、サービスにはプロパティがあるためdata、サービスを他のコントローラーに挿入してそのプロパティにアクセスすることで、サービスに直接アクセスできdataます

controllerCommunicationService.dataいつでもどこでも、メソッドを使用する必要はありませんon

@Anton で説明されているように、クエリ文字列\url フラグメントとクライアント ストレージを使用してデータを渡すこともできます。

于 2013-10-09T12:17:43.930 に答える