“Erro não detectado: ” com angular após a implantação

Eu tenho um aplicativo Angular bastante simples que funciona muito bem na minha máquina dev, mas está falhando com essa mensagem de erro (no console do navegador) depois de implantá-lo:

Uncaught Error: [$injector:unpr] http://errors.angularjs.org/undefined/$injector/unpr?p0=tProvider%20%3C-%20t%20%3C-%20%24http%20%3C-%20%24compile

Nenhuma outra mensagem além disso. Isso acontece quando a primeira página é carregada.

Estou executando o ASP.NET MVC5, Angular 1.2RC3 e empurrando para o Azure via git.

Pesquisando não apareceu nada interessante.

Alguma sugestão?

EDITAR:

Estou usando o TypeScript e definindo minhas dependencies com a variável $inject , por exemplo:

 export class DashboardCtrl { public static $inject = [ '$scope', '$location', 'dashboardStorage' ]; constructor( private $scope: IDashboardScope, private $location: ng.ILocationService, private storage: IDashboardStorage) { } } 

Eu acredito que deve (ou se destina a) contornar os problemas de renomeação de variables ​​locais que surgem durante a minificação e que podem causar esse erro.

Dito isso, claramente tem algo a ver com o processo de minificação, como quando eu configuro BundleTable.EnableOptimizations = true na minha máquina dev, eu posso reproduzi-lo.

Se você seguir o link, ele informará que o erro resulta do $ injector não conseguir resolver suas dependencies. Este é um problema comum com o angular quando o javascript é reduzido / uglificado / o que você está fazendo para produção.

A questão é quando você tem, por exemplo, um controlador;

 angular.module("MyApp").controller("MyCtrl", function($scope, $q) { // your code }) 

A minificação altera o $scope e $q em variables ​​aleatórias que não dizem ao angular o que injetar. A solução é declarar suas dependencies assim:

 angular.module("MyApp") .controller("MyCtrl", ["$scope", "$q", function($scope, $q) { // your code }]) 

Isso deve resolver o seu problema.

Apenas para reiterar, tudo o que eu disse é no link que a mensagem de erro fornece a você.

Corri para o mesmo problema, mas as definições do meu controlador pareciam um pouco diferentes das acima. Para controladores definidos como este:

 function MyController($scope, $http) { // ... } 

Basta adicionar uma linha após a declaração indicando quais objects injetar quando o controlador for instanciado:

 function MyController($scope, $http) { // ... } MyController.$inject = ['$scope', '$http']; 

Isso torna a segurança de minificação.

Esse problema ocorre quando o controlador ou diretiva não são especificados como uma matriz de dependencies e function. Por exemplo

 angular.module("appName").directive('directiveName', function () { return { restrict: 'AE', templateUrl: 'calender.html', controller: function ($scope) { $scope.selectThisOption = function () { // some code }; } }; }); 

Quando minificado O ‘$ scope’ passado para a function do controlador é substituído por um nome de variável de uma única letra. Isso tornará a falta de noção angular da dependência. Para evitar isso, passe o nome da dependência junto com a function como uma matriz.

 angular.module("appName").directive('directiveName', function () { return { restrict: 'AE', templateUrl: 'calender.html' controller: ['$scope', function ($scope) { $scope.selectThisOption = function () { // some code }; }] }; }); 

Se você separou os arquivos para angular app \ resources \ directives e outras coisas, pode simplesmente desabilitar a redução do seu pacote de aplicativos angulares como este (use o novo Bundle () em vez de ScriptBundle () no seu arquivo de configuração do pacote):

 bundles.Add( new Bundle("~/bundles/angular/SomeBundleName").Include( "~/Content/js/angular/Pages/Web/MainPage/angularApi.js", "~/Content/js/angular/Pages/Web/MainPage/angularApp.js", "~/Content/js/angular/Pages/Web/MainPage/angularCtrl.js")); 

E aplicativo angular apareceria no pacote sem modificações.

Adicione os serviços de escopo $ http, $ na function controller, às vezes, se eles estiverem faltando, esses erros ocorrerão.

Se você separou os arquivos para angular app \ resources \ directives e outras coisas, pode simplesmente desabilitar a redução do seu pacote de aplicativos angulares como este (use o novo Bundle () em vez de ScriptBundle () no seu arquivo de configuração do pacote):

Eu tive o mesmo problema, mas o problema era diferente, eu estava tentando criar um serviço e passar $ escopo para ele como um parâmetro.
Essa é outra maneira de obter esse erro, como diz a documentação desse link:

A tentativa de injetar um object de escopo em qualquer coisa que não seja um controlador ou uma diretiva, por exemplo, um serviço, também lançará um provedor desconhecido: $ scopeProvider <- $ scope error. Isso pode acontecer se um registrador erroneamente for registrado como um serviço, ex .:

 angular.module('myModule', []) .service('MyController', ['$scope', function($scope) { // This controller throws an unknown provider error because // a scope object cannot be injected into a service. }]);