Подтвердить что ты не робот

Решение Angularjs с контроллером как строка

Мой стиль написания контроллеров angular подобен (с использованием имени контроллера вместо функции)

angular.module('mymodule', [
])
    .controller('myController', [
        '$scope',
        function($scope) {
            // Some code here

        }
    ]);

Теперь мне нужно предоставить i-маршруты, чтобы определить часть решения:

 $routeProvider.when('/someroute', {
        templateUrl: 'partials/someroute.html', 
        resolve: myController.resolve}) // THIS IS THE CRITICAL LINE

Поскольку контроллер определяется как имя, как выполнить часть решения ниже?

Чтобы уточнить детали, я хочу загрузить некоторые данные с сервера до того, как маршрут будет разрешен, а затем использовать эти данные в контроллере.

ОБНОВЛЕНИЕ: Чтобы быть более точным, я хочу, чтобы каждый модуль имел свою функцию "разрешения", которая будет вызываться до того, как root будет запущен. Решение в этом сообщении (ответил Мишко Хевери) делает именно то, что я хочу, но у меня нет контроллеров как функций, а как имена.

4b9b3361

Ответ 1

Детали определения и разрешения контроллера должны быть указаны отдельно в определении маршрута.

Если вы определяете контроллеры на уровне модуля, вам нужно ссылаться на них как на строку, поэтому:

 $routeProvider.when('/someroute', {
        templateUrl: 'partials/someroute.html', 
        controller: 'myController',
        resolve: {
          myVar: function(){
            //code to be executed before route change goes here
          };
        });

В приведенном выше коде также показано, как определить набор переменных, которые будут разрешены до изменения маршрута. При разрешении эти переменные могут быть введены в контроллер, поэтому, взяв пример из фрагмента выше, вы должны написать свой контроллер следующим образом:

.controller('myController', ['$scope', 'myVar', function($scope, myVar) {
            // myVar is already resolved and injected here
        }
    ]);

Это видео может также помочь: http://www.youtube.com/watch?v=P6KITGRQujQ

Ответ 2

@pkozlowski.opensource отвечает, но я действительно не хочу испортить свои маршруты и контроллеры, потому что я всегда держу его отдельно (от Yo Generator). На самом деле, мы можем также иметь контроллер и разрешать (r) все как string/name (NOT function).

angular.module('mymodule', [
])
  .controller('myController', [
      '$scope', 'myModelCombination'
      function($scope, myModelCombination) {
          // myModelCombination[0] === (resolved) myModel 
          // myModelCombination[1] === (resolved) myModel2

      }
  ])
  .controller('myController2', [
      '$scope', 'myModel'
      function($scope, myModel) {
          // Some code here

      }
  ])
  .factory('myModel', [
      '$scope',
      function($scope) {
          // return a promise

      }
  ])
  .factory('myModel2', [
      '$scope',
      function($scope) {
          // return a promise

      }
  ])
  .factory('myModelCombination', [
      '$scope', 'myModel', 'myModel2'
      function($scope) {
          return $q.all(['myModel', 'myModel2']);

      }
  ]);

Затем в вашем файле маршрутизации следует добавить

$routeProvider.when('/someroute', {
    templateUrl: 'partials/someroute.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY)
});
$routeProvider.when('/myModelCombination', {
    templateUrl: 'partials/someroute2.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY)
});

http://docs.angularjs.org/api/ng. $routeProvider

Ответ 3

Ответ @TruongSinh работал у меня и намного лучше, чем наличие дополнительных функций в маршрутизаторе. Я немного изменил его, поскольку он возвращал отложенный объект вместо фактических разрешенных данных.

$routeProvider.when('/someroute', {
    templateUrl: 'partials/someroute.html', 
    controller: 'SomeController',
    resolve: {
       myModel: 'myModel'
    }
});

Ответ 4

Это тоже сработает

var MyController = myApp.controller('MyController', ['$scope', 'myData', function($scope, myData) {
  // Some code here
}]);

MyController.resolve = {
  myData: ['$http', '$q', function($http, $q) {
    var defer = $q.defer();

    $http.get('/foo/bar')
      .success(function(data) {
        defer.resolve(data);
      })
      .error(function(error, status) {
        defer.reject(error);
      });

    return defer.promise;
  }]
};