2013-04-29 10 views
44

Próbuję użyć szablonu z ziarnami kątowymi z domyślnymi ustawieniami. W controllers.js używam

angular.module('myApp.controllers', []). 
    controller('MyCtrl1', [function($scope) { 
     $scope.test = 'scope found!'; 
    }]) 
    .controller('MyCtrl2', [function() { 

    }]); 

Tam $scope zawsze jest niezdefiniowany. Kiedy wyjmę sterownik z modułu i zarejestruję go globalnie, działa dobrze. Jak tutaj:

function MyCtrl1($scope) { 
    $scope.test = "scope found!"; 
} 
MyCtrl1.$inject = ['$scope']; 

Czy ktoś mógłby mi wyjaśnić, dlaczego tak jest?

Odpowiedz

65

Nie można mieszać takich rzeczy. Musisz wybrać jedną z dwóch możliwości:

app = angular.module('test', []); 

// possibility 1 - this is not safe for minification because changing the name 
// of $scope will break Angular's dependency injection 
app.controller('MyController1', function($scope) { 
    // ... 
}); 

// possibility 2 - safe for minification, uses 'sc' as an alias for $scope 
app.controller('MyController1', ['$scope', function(sc) { 
    // ... 
}]); 

Nie polecam używania innej składni, która bezpośrednio deklaruje kontroler. Wcześniej czy później wraz z rozwojem twojej aplikacji będzie trudno ją utrzymać i śledzić. Ale jeśli trzeba, istnieją 3 możliwości:

function myController1 = function($scope) { 
    // not safe for minification 
} 

function myController2 = ['$scope', function(sc) { 
    // safe for minification, you could even rename scope 
}] 

var myController3 = function(sc) { 
    // safe for minification, but might be hard 
    // to read if controller code gets longer 
} 
myController3.$inject = ['$scope']; 
+1

Dzięki za wyjaśnienia. Nadal chcę wiedzieć, jak uzyskać odniesienie do zakresu $ scope przy użyciu domyślnej składni, którą Google podał w swoim szablonie: angular.module ('myApp.controllers', []). kontroler ("MyCtrl1", [function() { }}) . Controller ('MyCtrl2', [function() { }]); –

+0

@AshrafFayad Jedynym sposobem na uzyskanie odniesienia do '$ scope' jest zdefiniowanie kontrolera na jeden z wyżej wymienionych sposobów. – TheHippo

+0

Nie do końca prawda, w rzeczywistości pominąłeś to, co uważam za najbardziej preferowany sposób. – finishingmove

0

Byłem też szukając tej jednej, wydaje się, że trzeba wpisać '$scope' przed funkcji, jak poniżej:

angular.module('myApp.controllers', []). 
    controller('MyCtrl1', ['$scope', function($scope) { 
     $scope.test = 'scope found!'; 
    }]) 
    .controller('MyCtrl2', ['$scope',function() { 

    }]); 

To umila poczucie, myślę, że powinno być bardziej jasne, chociaż ..

+0

'' $ scope'' należało umieścić we właściwym miejscu. – Zeeshan

17

to jest właściwy sposób:

angular.module('myApp.controllers', []); 

angular.module('myApp.controllers').controller('MyCtrl1', ['$scope', function($scope) { 

}]); 
-1

Możesz po prostu usunąć "[" i "]", gdy używasz $ scope.

angular.module('myApp.controllers', []). 
 
controller('MyCtrl1', function($scope) { 
 
    $scope.test = 'scope found!'; 
 
    }) 
 
    .controller('MyCtrl2', [ 
 
    function() { 
 

 
    } 
 
    ]);

+0

Nie możesz * po prostu * usunąć [], gdy używasz zakresu (lub innego, jeśli o to chodzi). Możesz to zrobić, jeśli nie zależy ci na minifikacji, która jest czymś zupełnie innym. –

Powiązane problemy