Non sono riuscito a trovare la risposta che soddisfacesse alcune o tutte queste esigenze. Questo è quello che mi è venuto in mente.
Potrebbe esserci un modo migliore, quindi per favore condividi i tuoi pensieri.
Sto usando Angularjs 1.3.0-beta.8
Ho una forma con le direttive multi-nidificati che tutte contengono ingresso (s), selezionare (s), ecc ... Questi elementi sono tutti racchiusi in ng-ripetizioni e valori di stringa dinamici.
Questo è come utilizzare la direttiva:
<form name="myFormName">
<nested directives of many levels>
ex: <input ng-repeat=(index, variable) in variables" type="text"
my-name="{{ variable.name + '/' + 'myFormName' }}"
ng-model="variable.name" required />
ex: <select ng-model="variable.name" ng-options="label in label in {{ variable.options }}"
my-name="{{ variable.name + '/' + 'myFormName' }}"
</select>
</form>
Nota: è possibile aggiungere e indice per la concatenazione di stringhe, se avete bisogno di serializzare forse un tavolo di ingressi; che è quello che ho fatto. Tuttavia, gli input di nomi dinamici significano che potresti non conoscere il nome dell'input del modulo, quindi come chiameresti $ scope.formName. ??????. È possibile eseguire l'iterazione dell'oggetto $ scope.formName per ottenere chiavi che corrispondono a un determinato valore. Ciò significa concatenazione di stringhe in questo modo:
my-name="{{ dynamicString + hello + '/' + 'myFormName' }}"
Poi nel $ scope.myFormName si dovrebbe trovare un nome qualsiasi modulo di input, semplicemente scorrendo sopra l'oggetto e la raccolta di tutte le chiavi che hanno incluso 'ciao'.
app.directive('myName', function(){
var myNameError = "myName directive error: "
return {
restrict:'A', // Declares an Attributes Directive.
require: 'ngModel', // ngModelController.
link: function(scope, elem, attrs, ngModel){
if(!ngModel){ return } // no ngModel exists for this element
// check myName input for proper formatting ex. something/something
checkInputFormat(attrs);
var inputName = attrs.myName.match('^\\w+').pop(); // match upto '/'
assignInputNameToInputModel(inputName, ngModel);
var formName = attrs.myName.match('\\w+$').pop(); // match after '/'
findForm(formName, ngModel, scope);
} // end link
} // end return
function checkInputFormat(attrs){
if(!/\w\/\w/.test(attrs.rsName)){
throw myNameError + "Formatting should be \"inputName/formName\" but is " + attrs.rsName
}
}
function assignInputNameToInputModel(inputName, ngModel){
ngModel.$name = inputName
}
function addInputNameToForm(formName, ngModel, scope){
scope[formName][ngModel.$name] = ngModel; return
}
function findForm(formName, ngModel, scope){
if(!scope){ // ran out of scope before finding scope[formName]
throw myNameError + "<Form> element named " + formName + " could not be found."
}
if(formName in scope){ // found scope[formName]
addInputNameToForm(formName, ngModel, scope)
return
}
findForm(formName, ngModel, scope.$parent) // recursively search through $parent scopes
}
});
Questo dovrebbe gestire molte situazioni in cui semplicemente non si sa dove sarà il modulo. O forse hai moduli annidati, ma per qualche motivo vuoi collegare questo nome di input a due moduli? Bene, basta passare il nome del modulo a cui si desidera allegare il nome di input.
Quello che volevo, era un modo per assegnare valori dinamici agli input che non saprò mai, e poi chiamare $ scope.myFormName. $ Valido.
Questo può essere eccessivo e una soluzione migliore esiste in 1.3+. Non riuscivo a trovarlo nel tempo che avevo. Questo funziona per me ora.
Buona fortuna! Spero che questo aiuti qualcuno !!!!
http://stackoverflow.com/questions/21455695/angularjs-dynamic-form-field-validation/21457121#21457121 –