Il codice angolare placed on jsfiddle è per quanto riguarda una direttiva personalizzato, che utilizza $compile($element)($scope)
e fa sì che l'azione ng clic per accadere due volte: Le mie domande sono :
- Mi piacerebbe capire, perché l'azione ng-clic sta accadendo due volte?
- Qual è lo scopo di chiamare
$compile($element)($scope)
? - cosa succede se non viene chiamato, in quali circostanze si dovrebbe chiamare ?
Ecco i dettagli e quello che ho raccolto finora:
Vorrei capire, perché è il ng-clic su Azione accadendo due volte? La seguente riga mostra la direttiva personalizzata "ciao" e ng-clic su un pulsante. La direttiva personalizzata chiama $compile($element)($scope)
e questa è la linea che fa scattare l'azione due volte, ma non capisco come?
Test CLIC!
Ecco il codice - http://jsfiddle.net/4x4L3gtw/27/
<div ng-app='myApp' ng-controller='DirectiveTestController'>
<button hello ng-click="testClick()">Test CLICK!</button>
</div>
var myApp = angular.module('myApp', []);
myApp.controller('DirectiveTestController', ['$scope',
function ($scope) {
$scope.testClick = function() {
window.alert("hey");
console.log("hey");
}
}]);
myApp.directive('hello', function() {
return {
scope: true,
controller: ['$scope', '$element', '$compile', function ($scope, $element, $compile) {
$element.removeAttr('hello');
// $element.removeAttr('ng-click');
$compile($element)($scope);
}]
};
});
Qual è lo scopo di chiamare $compile($element)($scope)
, cosa succede se non è chiamato e in quali circostanze dovrebbe essere chiamato?
(cliccare sul pulsante e si noterà che l'azione accade due volte)
L'intento della direttiva è quello di nascondere/disattivare sulla base di una logica. così in questa direttiva vedo $element.removeAttr("ng-hide")
, ecc, e ogni volta il $element.removeAttr
si chiama è seguito con un $compile($element)($scope)
, è lo scopo di riscrivere il DOM?
Ho esaminato il DOM e non vedo ng-clic definito più volte. Durante l'esame del DOM (firebug), ho esaminato $ element-> 0-> attributes-> ng-click (tra gli altri elementi).
Se rimuovo ng-clic utilizzando $element.removeAttr("ng-click")
allora l'azione accade solo una volta. Oppure se rimuovo lo $compile($element)($scope)
l'azione si verifica solo una volta.
Rodion grazie, la prego di spiegare perché il metodo di collegamento al posto del controller – liontale
buona spiegazione delle differenze tra controller e creare un collegamento si può trovare in altra domanda: http://stackoverflow.com/questions/15676614/directive-link-vs-compile-vs-controller. Non ne sono sicuro, ma a mio avviso il motivo principale, perché dovresti fare operazioni con DOM in link è perché il link richiama dopo la compilazione html. – Rodion