Sto creando componenti UI riutilizzabili con direttive AngularJS. Mi piacerebbe avere un controller che contenga la mia logica di business con i componenti nidificati (direttive). Voglio che le direttive siano in grado di manipolare una singola proprietà sull'ambito del controller. Le direttive devono avere un ambito isolato perché potrei utilizzare la stessa direttiva più di una volta e ogni istanza deve essere associata a una particolare proprietà dell'ambito del controller.Aggiornamento del controllore scope dalla direttiva
Finora, l'unico modo per applicare le modifiche all'ambito del controller è chiamare scope.$apply()
dalla direttiva. Ma questo si interrompe quando sono all'interno di una callback ng-click a causa di errori rootScope: inprog (scope scope in progress).
Quindi la mia domanda: qual è il modo migliore per rendere consapevole il mio controller quando una direttiva secondaria ha aggiornato un valore sull'ambito del controllore?
Ho considerato di avere una funzione sul controller che la direttiva potrebbe chiamare per fare un aggiornamento, ma mi sembra pesante.
Ecco il mio codice che si interrompe in un callback ng-clic. Ricorda che non voglio solo risolvere il problema di ng-click. Voglio la migliore soluzione globale per applicare le direttive riutilizzabili per modificare un ambito/modello genitore.
html
<div ng-controller="myCtrl">
<my-directive value="val1"></my-directive>
</div>
controllore
...
.controller('myCtrl', ['$scope', function ($scope) {
$scope.val1 = 'something';
}});
direttiva
...
.directive('myDirective', [function() {
return {
link: function(scope) {
scope.buttonClick = function() {
var val = 'new value';
scope.value = val;
scope.$apply();
};
},
scope: {
value: '='
},
template: '<button ng-click="buttonClick()"></button>'
};
}]);
Si potrebbe emettere eventi in $ rootScope. –
@camden_kid speravo in un migliore incapsulamento. Per lo meno userò il metodo di controllo che ho preso in considerazione. Non penso però di voler aggiungere più chatter sull'ottica di root. – Brett
Non è necessario chiamare $ apply(), poiché la funzione buttonClick viene chiamata dalla direttiva ng-click e pertanto non viene eseguita al di fuori della gestione degli eventi di angular. Se vuoi modificare un attributo, allora quello che hai va bene (eccetto che non devi usare $ apply()). Se si desidera chiamare una funzione di callback, quindi passare una funzione chiamabile usando ''&'' invece di ''=''. –