Ho una direttiva personalizzata che utilizza un attributo per specificare un altro controllo che modifica.Test unitario Direttiva angolare che accede all'elemento esterno
direttiva definizione dell'oggetto:
{
restrict: 'E',
templateUrl: 'myTemplate.html',
scope: {
targetId: '@'
},
controller: MyController,
controllerAs: 'vm',
bindToController: true
}
Una funzione sul controller della direttiva modifica il contenuto dell'elemento a bersaglio (un campo di ingresso):
function onSelection (value) {
var $element = $('#' + vm.targetId);
$element.val('calculated stuff');
$element.trigger('input');
}
I test di unità (gelsomino/Karma/PhantomJS attualmente acclude l'elemento alla pagina. Funziona, ma sembra un odore di codice.
beforeEach(inject(function($rootScope, $compile) {
var elementHtml = '<my-directive target-id="bar"></my-directive>' +
'<input type="text" id="bar">';
scope = $rootScope.$new();
angularElement = angular.element(elementHtml);
angularElement.appendTo(document.body); // HELP ME KILL THIS!
element = $compile(angularElement)(scope);
scope.$digest();
}));
afterEach(function() {
angularElement.remove(); // HELP ME KILL THIS!
});
Ho provato a riscrivere la funzione controller per evitare jQuery; questo non ha aiutato.
Come posso modificare la direttiva oi test per eliminare l'appendice/rimuovere?
È molto più grande l'odore del codice che usi gli id nella direttiva. È molto stile jQuery e non "modo angolare". Prendi in considerazione l'uso di 'require' in direttive sullo stesso ramo dell'albero DOM, o approcci" common-parent "o" global service "(puoi cercare o fare un'altra domanda se non sai come farlo - la spiegazione è decisamente fuori della portata di questa domanda) –
@ValentynShybanov Sono aperto a soluzioni che comportano la revisione della direttiva. Lo scopo reale di questa direttiva è di inserire segnaposto mail-merge in un campo input o textarea (che non dovrebbe essere parte del modello di direttiva, e preferirei evitare la transclusione). Se desideri pubblicare un esempio del tuo metodo raccomandato o link a questo, prenderei in considerazione l'idea di accettarlo come risposta. – TrueWill
Non penso che sarete in grado di uccidere l'elemento Aggiungi/Rimuovi dal codice senza refactoring della funzione 'onSelection()'. C'è qualche ragione per cui non puoi associare un 'ng-model' al tuo ingresso #bar?Se si potesse fare ciò, allora si potrebbe semplicemente impostare il valore nel controller senza bisogno di afferrare l'elemento con jQuery. – jperezov