2013-04-17 14 views
32

Ho ancora un altro problema con il minification. Questa volta è a causa del servizio $ scope passato al controller della direttiva. Vedere il codice sottostante:AngularJS: problema di minification nella direttiva

angular.module('person.directives'). 
directive("person", ['$dialog', function($dialog) { 
return { 
    restrict: "E", 
    templateUrl: "person/views/person.html", 
    replace: true, 
    scope: { 
     myPerson: '=' 
    },  
    controller: function ($scope) 
    {     
     $scope.test = 3;     
    } 
} 
}]); 

Se commento la parte del controller, quindi funziona correttamente.

Come si può vedere, ho utilizzato la dichiarazione di array per la direttiva, quindi il servizio di dialogo $ è noto per Angular anche dopo il minification. Ma come faccio a farlo per il servizio $ scope sul controller?

risposta

73

è necessario dichiarare un controller come segue:

controller: ['$scope', function ($scope) 
    {     
     $scope.test = 3;     
    }] 

esempio completo qui:

angular.module('person.directives'). 
directive("person", ['$dialog', function($dialog) { 
return { 
    restrict: "E", 
    templateUrl: "person/views/person.html", 
    replace: true, 
    scope: { 
     myPerson: '=' 
    },  
    controller: ['$scope', function ($scope) 
    {     
     $scope.test = 3;     
    }] 
} 
}]); 

Una soluzione fornita da @ Sam avrebbe funzionato a ma sarà di esporre controllore di direttiva per l'intera applicazione che non è necessaria.

+0

questa è la soluzione fornita da me :) Sam = OP ;-) Tuttavia non sto esponendo il controller all'intera applicazione, solo all'intero modulo a cui appartiene la direttiva. Mi piace il tuo approccio, però, vado per quello. – Sam

+0

In realtà esporlo a un modulo AngularJS significherebbe che il modulo _any_ AngularJS avrebbe accesso ad esso - questo è ciò che intendevo esponendolo all'intera applicazione. –

+0

I moduli AngularJS hanno accesso al modulo person.controllers solo se dipendono da esso. Se non hanno quella dipendenza, non dovrebbero essere in grado di accedervi. Non è giusto? – Sam

1

ok, ho finito per creare il controller in un file separato:

angular.module('person.controllers').controller('personCtrl', ['$scope', function ($scope) { 
$scope.test = 3; 
}]); 

poi nella direttiva, ho assegnare il controller per nome:

controller: 'personCtrl' 
Non

sicuro che sia il modo migliore. Sembra pulito però. Cosa ne pensi ?

+3

Ciò funzionerebbe ma significherebbe esporre il controller della direttiva all'intera applicazione che non è necessaria. –

Problemi correlati