1

我有一个控制器,它使用 $http 获取 XML 文件并将其解析为 json 对象。这是'MainCtrl'。现在我想在其他控制器中获得相同的 json 对象,而无需再次通过 $http,因为我已经加载了 XML。

这是我的第一个控制器

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);
}

这是我的第二个控制器

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

我想我需要使用工厂。但我不知道该怎么做。我尝试了一种在工厂内获取 XML 的实现。但是当我调用工厂方法时,它正在执行另一个我通过控制台确认的 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);
});

您甚至可以$rootScope直接通过 DI 使用并$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 回答
2

在控制器中进行 XHR 调用不是最佳实践。如果您有可用数据,请在工厂中将其分开并注意不要重复调用。您的服务应该完全控制何时访问服务器以获取数据。控制器应该只访问服务。

我可能会这样做:

App.factory('eywa', ['$http', function($http) {
  var eywaFactory = {};

  eywaFactory.data = '';
  eywaFactory.load = function() {
    this.data = $http.get('./assets/js/angularxml/courseDef.xml').then(function(data) {
      return x2js.xml_str2json(data);
    });
    return this.data;
  };

  eywaFactory.get = function() {
    return this.data === '' ? this.load() : this.data;
  };

  return eywaFactory;
}]);

并调用控制器内部的服务:

App.controller('MainCtrl', function($scope, eywa) { 
    eywa.get().then(function(data) {
      $scope.courseDef = data;
    });
});
于 2013-08-10T06:45:24.817 回答