2015-02-18 3 views
1

Следуя основному ответу here, я попытался сделать то же самое, за исключением того, что мой контроллер изолирован. я получаю это:

Uncaught Error: [$injector:modulerr] Failed to instantiate module myApp due to: 
ReferenceError: myController is not defined 

я только получаю это когда параметр resolve: присутствует. Как я могу обойти этот?

Маршрут конфигурации:

.state("my.jobs", { 
        url: "/my/:jobId", 
        templateUrl: "Views/my/index.htm", 
        controller: "myController", 
        resolve: myController.resolve // the root of all evil here 
       }) 

контроллер:

(function (ng, app) { 

    "use strict"; 

    var ctrl = app.controller(
     "myController", 
     ['$scope', 'job', 
     function ($scope, job) { 
      $scope.job = job; 
     }]); 

    ctrl.resolve = { 
     job: function ($q, $stateParams, batchService) { 
      var deferred = $q.defer(); 
      jobService.loadJob($stateParams.jobId, true) 
        .then(deferred.resolve, deferred.reject); 
     }, 
     delay: function ($q, $defer) { 
      var delay = $q.defer(); 
      $defer(delay.resolve, 1000); 
      return delay.promise; 
     } 
    }; 
})(angular, myApp); 

Я не хочу, чтобы контроллер глобальная функция, я люблю его изоляции, как это.

+0

примере, вы имеете в виду работает, потому что он использует глобальную переменную, и ваше дело вы делаете переменной изолированные , –

+0

Да, я уже упоминал, как я могу заставить его работать с изолированными контроллерами. – AlexandruC

+0

@ak работает без функции разрешения() ?, я бы предложил вам поставить свой код внутри углового обслуживания .. и затем использовать его .. –

ответ

1

В вашем случае вы можете создать одну услугу, которую вы можете использовать внутри своей функции разрешения.

app.factory('resolveService', ['$q', '$stateParams', 'batchService','jobService',function($q, $stateParams, batchService,jobService) { 
    return { 
     job: function($q, $stateParams, batchService) { 
      var deferred = $q.defer(); 
      jobService.loadJob($stateParams.jobId, true).then(deferred.resolve, deferred.reject); 
      return delay.promise; 
     }, 
     delay: function($q, $defer) { 
      var delay = $q.defer(); 
      $defer(delay.resolve, 1000); 
      return delay.promise; 
     } 
    } 
}]); 

Затем код конфигурации будет

.state("my.jobs", { 
    url: "/my/:jobId", 
    templateUrl: "Views/my/index.htm", 
    controller: "myController", 
    resolve: { 
     resolveService: "resolveService" //this resolves to a service 
    } 
}); 

Для получения дополнительной информации взглянуть на this reference

Смежные вопросы