Tôi không thể tìm thấy câu trả lời thỏa mãn một số hoặc tất cả các nhu cầu này. Đây là những gì tôi nghĩ ra.
Có thể có cách nào tốt hơn, vì vậy hãy chia sẻ suy nghĩ của bạn.
Tôi đang sử dụng Angularjs 1.3.0-beta.8
Tôi có một mẫu với chỉ thị đa lồng nhau mà tất cả đều chứa đầu vào (s), chọn (s), vv ... Những yếu tố này đều kèm theo trong ng-lặp lại, và giá trị chuỗi động.
Đây là cách sử dụng chỉ thị:
<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>
Lưu ý: bạn có thể thêm và chỉ số để các nối chuỗi nếu bạn cần để serialize lẽ một bảng đầu vào; đó là những gì tôi đã làm. Tuy nhiên, đầu vào tên động có nghĩa là bạn có thể không biết tên của đầu vào biểu mẫu, vì vậy làm thế nào bạn sẽ gọi $ scope.formName. ??????. Bạn có thể lặp lại đối tượng $ scope.formName để nhận các khóa khớp với một giá trị nhất định. Điều đó có nghĩa nối chuỗi như thế này:
my-name="{{ dynamicString + hello + '/' + 'myFormName' }}"
Sau đó trong $ scope.myFormName bạn sẽ tìm thấy bất kỳ tên đầu vào hình thức bằng cách chỉ cần lặp lại so với đối tượng và thu thập bất kỳ phím bao gồm 'hello'.
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
}
});
Điều này sẽ xử lý nhiều tình huống mà bạn không biết biểu mẫu sẽ ở đâu. Hoặc có lẽ bạn có các biểu mẫu lồng nhau, nhưng vì một lý do nào đó bạn muốn đính kèm tên đầu vào này vào hai biểu mẫu? Vâng, chỉ cần vượt qua trong tên biểu mẫu bạn muốn đính kèm tên đầu vào.
Những gì tôi muốn, là một cách để gán giá trị động cho đầu vào mà tôi sẽ không bao giờ biết, và sau đó chỉ cần gọi $ scope.myFormName. $ Valid.
Đây có thể là quá mức cần thiết và giải pháp tốt hơn tồn tại trong 1,3+. Tôi không thể tìm thấy nó trong thời gian tôi có. Điều này làm việc cho tôi bây giờ.
Chúc may mắn! Hy vọng điều này sẽ giúp ai đó !!!!
http://stackoverflow.com/questions/21455695/angularjs-dynamic-form-field-validation/21457121#21457121 –