2012-10-17 19 views
7

Używam AngularJS w projekcie Ruby on Rails 3.2.8 z zasobami.Błąd: Nieznany dostawca: aProvider <- a

Kiedy ładuję mój formularz, który używa AngularJS na mojej maszynie programistycznej, nie mam problemu. Jednakże gdy załadować tę samą postać na moim serwerze produkcyjnym otrzymuję ten błąd w konsoli javascript:

Error: Unknown provider: aProvider <- a 

mam śledzone z powrotem do mojego pliku coffeescript gdzie angularjs instalacji do stosowania w formie:

$ (event) -> 
    $("#timesheet_description").autocomplete({source: '/autocomplete/work_descs'}) 

    # Create AngularJS module 
    app = angular.module 'timesheetApp', [] 

    # Create a AngularJS controller 
    app.controller "TimesheetCtrl", ($scope) -> 
    $scope.costed_amount = 0 
                           # Bind my module to the global variables so I can use it. 
    angular.bootstrap document, ["timesheetApp"] 

Po skomentowaniu tego wszystkiego strona zostanie załadowana bez błędów i bez umiejętności AngularJS.

Czy przyczyną problemu jest kompilacja i zminimalizowanie zasobów Rails? Czy istnieje sposób, aby to naprawić i nadal korzystać z zasobów coffeescript i Rails?

+1

Zauważyłem, że jeśli zmieni się nazwa '$ scope', pęknie. Proponuję jawnie wstrzykiwać '$ scope' przez' app.controller ('TimesheetCtrl', ['$ scope', function ($ scope) {...}]); '(w sposób równoważny kawsips) Mogą być inne takie przypadki. – Tosh

+0

To naprawiło to, dziękuję. – map7

Odpowiedz

20

AngularJS, używając używanego stylu (zwanego wstępnym typowaniem), używa nazw argumentów funkcji do wykonania iniekcji zależności. Tak więc, minifikacja całkowicie to przełamuje.

Poprawka jest jednak prosta. W każdym przypadku, gdzie trzeba zastrzyk (używasz „$ xxx”) zmienne, to zrobić:

app.controller "TimesheetCtrl", ['$scope', ($scope) -> 
    $scope.costed_amount = 0 
] 

zasadzie wymienić wszystkie definicje funkcji z tablicy. Ostatnim elementem powinna być sama definicja funkcji, a pierwsze to $names obiektów, które chcesz wstrzyknąć.

Istnieje kilka (choć niewystarczająco jasne) informacji na temat docs.

+0

Więcej informacji można znaleźć tutaj: http: //docs.angularjs.org/tutorial/step_05 Poszukaj "Notki o minimalizacji" –

+2

Możesz też użyć świetnego, świetnego modułu ng-min, który się tym zająć. Bardzo dobrze wyjaśnione na egghead.io: https://egghead.io/lessons/angularjs-ngmin – Mat

+1

Upewnij się, że zastosowałeś ten wzorzec także do kontrolerów specyficznych dla danej dyrektywy! – tsikov

6

Jeśli przegapisz gdzieś tablicę, aby ją zlokalizować, musimy trochę zmodyfikować kod kątowy, ale jest to bardzo szybkie rozwiązanie.

zmiana to console.log ("Array Notation is Missing", fn); (linia nr 11 z funkcji start)

Sprawdzaj funkcję opisywanie w angularjs (non-minified)

function annotate(fn) { 
     var $inject, 
      fnText, 
      argDecl, 
      last; 

     if (typeof fn == 'function') { 
     if (!($inject = fn.$inject)) { 
      $inject = []; 
      if (fn.length) { 
console.log("Array Notation is Missing",fn); 
fnText = fn.toString().replace(STRIP_COMMENTS, ''); 
     argDecl = fnText.match(FN_ARGS); 
     forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ 
      arg.replace(FN_ARG, function(all, underscore, name){ 
      $inject.push(name); 
      }); 
     }); 
     } 
     fn.$inject = $inject; 
    } 
    } else if (isArray(fn)) { 
    last = fn.length - 1; 
    assertArgFn(fn[last], 'fn'); 
    $inject = fn.slice(0, last); 
    } else { 
    assertArgFn(fn, 'fn', true); 
    } 
    return $inject; 
} 
+0

to świetna wskazówka, dzięki – Jason

+0

To był jedyny sposób, w jaki mogłem znaleźć moją brakującą składnię tablic. Dzięki za tonę! +1 –

0

Aby minify kątowe wszystko czego potrzebujesz to zrobić, to zmienić swoje zgłoszenie do " tryb array”deklaracja "" na przykład:

Od:

var demoApp= angular.module('demoApp', []); 
demoApp.controller(function demoCtrl($scope) { 
}); 

To

var demoApp= angular.module('demoApp', []); 
demoApp.controller(["$scope",function demoCtrl($scope) { 
}]); 

Jak deklarować usługi fabryczne?

demoApp.factory('demoFactory', ['$q', '$http', function ($q, $http) { 
    return { 
      //some object 
    }; 
}]); 
Powiązane problemy