2015-10-15 5 views
1

Я работаю с унаследованным приложением VB.Net, которое унаследовал. Директивы нг-приложений и нг-контроллер как появляются на HTML элемент главной страницы корня:Угловой контроллер возвращен undefined

<html runat="server" id="html" ng-controller="MasterController"> 

Атрибут ng-app устанавливается в коде-позади для страницы. Он присутствует, когда я запускаю страницу и просматриваю источник. Приложение распространяется до модуля ng-app="myModule"

Контроллер определяется в функции передается add_load в MasterPage также, не совсем в конце тела, но не далеко от него:

Sys.Application.add_load(function() { 

     var module = angular.module('myModule'); 
     var MasterController = function ($scope, $compile) { 
      ... // stuffs 
      } 
     }; 

     module.controller('MasterController', ["$scope", "$compile", MasterController]); 

    }); 

Локально , это работает (или, похоже, работает) отлично, я не вижу ошибок в консоли. Тем не менее, приложение теперь было развернуто в промежуточной среду, и в консоли браузера в этой среде я вижу угловую ошибку:

[ng:areq] not a function got undefined

Есть очень мало различий между плацдармом и моей местной окружающей средой, эти различиями во многом то, что путник сценариев .Net используется для конкатенации и минимизации множества файлов JS, включая Angular, и данных, используемых приложением. AFAIK нет других различий.

Я не думаю, что связка вызывает проблему, поскольку я включил локальное соединение, и я не вижу ошибки. Я также не вижу, что данные, переданные приложению, вызывают проблему (это данные клиента, данные учетной записи и т. Д.), Поскольку он даже не используется в этом конкретном контроллере.

ответ

2

Не используйте синтаксис выражения функции, поскольку переменная может быть вызвана до ее назначения. Используйте синтаксис объявления функции вместо этого для best practices guide.

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

var module = angular.module('myModule'); 
function masterController($scope, $compile) { 
    ... // stuffs 
} 

masterController.$inject = ["$scope", "$compile"]; 

module.controller('MasterController', masterController); 
+0

Спасибо за советы! Руководство по стилю выглядит великолепно. Я попробую их как можно скорее – danwellman

+0

Все еще не понимаю, почему это лучшая практика. Почему разделение 1 логической строки, объявляющей функции контроллеров на 3 строки, является настолько умной идеей ... –

+1

@PetrAveryanov, потому что инъекция зависимостей Angular 1.x использует сопоставление строк и/или синтаксис массива «взломать», который был добавлен позже (возможно, версия 1.2?). Вытащив его явно, вы гарантируете, что ваш код безопасен и он явный и очень читаемый. Любой последующий разработчик точно узнает, что делает этот код. Кроме того, сколько контроллеров в конечном итоге растет, чтобы ввести 10 аргументов? Это очень длинный «однострочный». Разрушая его, вам легче контролировать и читать ваше заявление. –