2013-04-29 6 views
44

Sto provando a utilizzare il modello di seme angolare con le impostazioni predefinite. In controllers.js Io uso

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

    }]); 

C'è la $scope è sempre indefinito. Quando estrae il controller dal modulo e lo registro globalmente, funziona perfettamente. Come qui:

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

Qualcuno potrebbe spiegarmi perché questo è?

risposta

65

Non è possibile combinare cose del genere. È necessario decidere su una delle due possibilità:

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) { 
    // ... 
}]); 

Non consiglierei utilizzando l'altra sintassi che dichiara direttamente Controller. Prima o poi con la crescita della tua app diventerà difficile mantenere e tenere traccia. Ma se è necessario, ci sono 3 possibilità:

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

Grazie per la spiegazione. Voglio ancora sapere come ottenere un riferimento a $ scope usando la sintassi predefinita fornita da google nel proprio modello: angular.module ('myApp.controllers', []). controllore ('MyCtrl1', [function() { }]) .controller ('MyCtrl2', [function() { }]); –

+0

@AshrafFayad L'unico modo per ottenere un riferimento a '$ scope' è definire un controller in uno dei modi sopra menzionati. – TheHippo

+0

Non completamente vero, in effetti hai tralasciato quello che penso sia il modo più preferito di farlo. – finishingmove

0

Sono stato anche alla ricerca di quello, sembra che è necessario digitare '$scope' prima della funzione, come di seguito:

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

    }]); 

Si fa un pò senso, penso che dovrebbe essere più chiaro anche se ..

+0

'' $ scope'' era necessario per essere collocato nella sua posizione corretta. – Zeeshan

17

Questo è il modo corretto:

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

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

}]); 
-1

È possibile rimuovere semplicemente '[' e ']' quando si utilizza $ scope.

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

 
    } 
 
    ]);

+0

Non è possibile * semplicemente * rimuovere [] quando si utilizza l'ambito (o qualsiasi altro, per quello). Puoi farlo, se non ti interessa la minificazione, che è qualcosa di completamente diverso. –

Problemi correlati