1

$http を使用して XML ファイルをフェッチし、それを json オブジェクトに解析するコントローラーがあります。これが「MainCtrl」です。既に XML を読み込んでいるため、$http を再度使用せずに、他のコントローラーで同じ json オブジェクトを取得したいと考えています。

これが私の最初のコントローラーです

angularXML.controller('MainCtrl', ['$scope', '$http','courseDefService', function($scope, $http, courseDefService) {
    $http.get(base_url + 'assets/js/angularxml/courseDef.xml').then(function(response) {
    var chapters = [];
    var courseDef = x2js.xml_str2json(response.data);
    console.log(courseDef);
}

そして、これが私の2番目のコントローラーです

angularXML.controller('chapterCtrl', ['$scope', '$routeParams', function($scope, $routeParams) {
$scope.chapterNumber = $routeParams.id;
var chapter = $scope.chapterNumber - 1; /* index starts from zero */
}

私は工場を使う必要があると思います。しかし、私はそれを行う方法がわかりません。ファクトリ内で XML をフェッチする実装を 1 つ試しました。しかし、ファクトリ メソッドを呼び出していたときに、コンソールで確認した別の ajax リクエストを実行していました。

助けてください。

4

3 に答える 3

5

アプリでメッセージ バスのようなものを作成するのはどうでしょうか。

まず、MessageBusサービスを作成します。

module.factory("MessageBus", function($rootScope) {
    return {
        broadcast : function(event, data) {
            $rootScope.$broadcast(event, data);
        }
    };
});

次に、オリジネーター コントローラーに挿入します。

function OriginatorController($scope, MessageBus) {
    $scope.funct = function(e) {
        // get data
        MessageBus.broadcast("data", data);
    };
};

そして、好きな場所でイベントをサブスクライブします:

$scope.$on("data", function(arguments) {
    console.log(arguments);
});

$rootScopeDI を介して直接使用$broadcastしてコントローラーで呼び出すこともできますが、サービスを作成する方がより表現力豊かです。

編集これがあなたのためのペンです。

于 2013-08-09T14:44:21.890 に答える
3

これは別の迅速で汚いアプローチです: http://jsfiddle.net/cAY2N/

基本的に、各コントローラーはサービス内のいくつかの変数への参照を持っています。サービスのデータが変更されると、その変更はすべてのコントローラーに自動的に反映されます。

var app = angular.module('centralizedData', []);

app.service('CentralService', function($q, $timeout) {
    var self  = this,
        count = 0
        ;

    this.centralData = {};

    this.getData = function() {
        $timeout(function() {
            self.centralData.message = 'Hello: ' + count++;
        });
    };
});

app.controller('FirstController', function($scope, CentralService) { 
    $scope.data = CentralService.centralData;   
    CentralService.getData();
});

app.controller('SecondController', function($scope, CentralService) {
    $scope.data = CentralService.centralData;
    setTimeout(CentralService.getData, 2000);
});
于 2013-08-09T14:49:05.383 に答える