Sto lavorando ad un progetto più grande con AngularJS. Pertanto, voglio rendere il lavoro per una singola forma il più semplice possibile. Come stiamo utilizzando anche bootstrap, il codice per un singolo campo di input in una forma è abbastanza prolisso, forse comeCome posso aggiungere automaticamente etichette ai campi di input?
<div class="control-group">
<label class="control-label" for="inputEmail">Email</label>
<div class="controls">
<input type="text" id="inputEmail" placeholder="Email">
</div>
</div>
Se potessi scrivere un singolo tag come
<custom-input
label="Email"
name="inputEmail"
placeholder="Email"
type="text"
... >
</custom-input>
invece, questo sarebbe aiuta a mantenere il codice pulito e il lavoro semplice.
Per ottenere questo risultato, sto lavorando a una direttiva AngularJS personalizzata. La mia direttiva attualmente usa un modello simile all'esempio bootstrap dall'alto, assegnando automaticamente l'etichetta al tag di input. Inoltre, la funzione del compilatore della direttiva sposta tutti gli attributi dal tag di input personalizzato al tag di input reale al fine di semplificare la personalizzazione del tag di input personalizzato.
app.directive('customInput', function() {
return {
require: 'ngModel',
restrict: 'E',
template: '<div>' +
'<label for="{{ name }}">the label</label>' +
'<input id="{{ name }}" ng-model="ngModel" />' +
'</div>',
scope: {
ngModel: '=',
name: '@name',
},
replace: true,
compile: function (tElement, tAttrs, transclude) {
var tInput = tElement.find('input');
// Move the attributed given to 'custom-input'
// to the real input field
angular.forEach(tAttrs, function(value, key) {
if (key.charAt(0) == '$')
return;
tInput.attr(key, value);
tInput.parent().removeAttr(key);
});
return;
},
};
});
su Stack Overflow, ci sono molte domande riguardanti la creazione di campi di input personalizzati, ma si sono interessati con l'data binding, custom formatting o binding to ng-repeat.
Il mio approccio presenta tuttavia un problema diverso: mentre il collegamento dati funziona correttamente, il modulo di convalida modulo integrato di Angular viene confuso quando il campo di input è "richiesto". Per qualche motivo, la convalida non riconosce il nuovo campo di input e invece mantiene il modulo invalido a causa di qualche riferimento morto, che ha un valore vuoto. Si prega di vedere the minimal example.
Da dove viene il riferimento morto? Come posso aggiornare i riferimenti del modulo di validazione? C'è un modo migliore per raggiungere il mio obiettivo generale?
Grazie, Jason! Usando 'tInput.prop (key, true)' invece della chiamata 'attr'-per gli attributi con' value == '' 'fa il trucco se non vuoi usare' required = "required" '. –
Mi piacerebbe avere questa risposta per una domanda angolare (2+)! – PaulCo