2015-03-01 2 views
1

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

Вот мои файлы дерева:

  • index.html
  • app.js
  • просмотров
    • prod.html
    • cat.html
  • контроллеры
    • prod.js
    • cat.js

Я хочу, чтобы, когда пользователь получить /prod/ URL приложение будет загружать (в его) prod.html и prod.js для логики контроллера динамически.
Вся эта логика, конечно, требовала ng-маршрута.

Index.html

<body data-ng-app="myApp"> 
    <div data-ng-view=""></div> 
</body> 

Default.js с использованием AngularJS v1.3.14

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

app.config(function ($routeProvider, $locationProvider, $controllerProvider, $provide) { 
    $locationProvider.html5Mode({ 
     enabled: true, 
     requireBase: false 
    }); 

    app.registerCtrl = $controllerProvider.register; 

    $routeProvider. 
     when('/:name', { 
      templateUrl: function (urlAttr) { 
       return '/views/' + urlAttr.name + '.html'; 
      } 
     }); 

    // This code throw error: 
    //TypeError: undefined is not a function 
    //at angular.min.js:1 
    //at r (angular.min.js:1) 
    //at at (angular.min.js:1) 
    //at b (angular.min.js:1) 
    //at b (angular.min.js:1) 
    //at b (angular.min.js:1) 
    //at b (angular.min.js:1) 
    //at $get.t (angular.min.js:1) 
    //at angular.min.js:1 
    //at p.$get.p.$eval (angular.min.js:1) 
    $provide.decorator('$controller', ['$delegate', function ($delegate) { 
     // I want to get the controller name and than load the js file. 
     // return function (constructor, locals) { 
     //  if (typeof constructor == "string") { 
     //   locals.$scope.loadControllerScript(constructor); 
     //  } 
     //  return $delegate(constructor, locals); 
     // } 
    }]); 
}); 

Prod.html

<div class="row" data-ng-controller="prodCtrl"> 
{{test}} 
</div> 

Prod.js

app.registerCtrl('prodCtrl', function ($scope) { 
    $scope.test = ''; 
}); 

Проблема заключается ошибка: "неопределенные не является функцией". (См. Код в Default.js)
Если вопрос непонятен, я буду рад объяснить больше.

+0

Можете ли вы показать код, в котором вы предоставляете функцию loadControllerScript? – preslavrachev

+0

Это не имеет значения. Исключение выбрано в «$.decorator ('$ controller', ['$ delegate', function ($ delegate) {" - до "loadControllerScript". Я обновлю свой вопрос. –

ответ

7

На этапе конфигурации вы не можете запрашивать экземпляры (например, $ controller). Вы можете получить доступ только к провайдерам. Проверьте docs:

Configuration blocks - get executed during the provider registrations and configuration phase. Only providers and constants can be injected into configuration blocks. This is to prevent accidental instantiation of services before they have been fully configured.

UPDATE: Это работает:

var app = angular.module("myApp", ['ng'], ['$provide', function($provide) { 
    $provide.decorator('$controller', ['$delegate', function($delegate) { 
     return function(constructor, locals) { 
      console.log("executing custom code ..."); 
      return $delegate(constructor, locals); 
     } 
    }]) 
}]); 

Проверить это demo

+0

Итак, где я могу запустить код, который будет динамически загружать скрипт контроллера? –

+0

Спасибо! Работает. Теперь я получаю еще одну ошибку: «объект не является функцией» в сценарии углового кода в строке 7698 (несжатая версия) »forEach (контроллеры, функция (контроллер) {« Я использую угловой v1.3.14. –

+0

Кажется, что Проблемы с совместимостью. Код работает только для Angular 1.2.x или ниже. – Angad

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