2014-01-30 113 views
15

我想驗證這是給我從後端端點某種形式的領域...AngularJS動態表單域驗證

所以基本上input元素ng-repeat內動態創建。 因此,input屬性也被動態添加,如typename,等...

但是因爲name屬性是動態添加,當我嘗試驗證它,像這樣的,例如:

myForm.elName.$valid 

它不會返回任何東西,因爲此時它不知道什麼是elName

我創建了一個的jsfiddle來演示該問題: http://jsfiddle.net/peduarte/HB7LU/1889/

任何幫助或建議將不勝感激!

FANX。

編輯:
我已經提到這個真棒文檔: http://docs.angularjs.org/api/ng.directive:input.email

+0

請,發展。爲什麼你會爲angularJS每秒鐘後悔? – Ant

+1

這就是你要找的http://stackoverflow.com/questions/27071413/dynamic-form-name-attribute-input-type-text-name-variable-name-in – SoEzPz

回答

35

試試我的自定義指令:

myApp.directive("dynamicName",function($compile){ 
    return { 
     restrict:"A", 
     terminal:true, 
     priority:1000, 
     link:function(scope,element,attrs){ 
      element.attr('name', scope.$eval(attrs.dynamicName)); 
      element.removeAttr("dynamic-name"); 
      $compile(element)(scope); 
     } 
    }; 
}); 

使用它:

<input dynamic-name="field.name" 
     type="{{ field.type }}" 
     placeholder="{{ field.name }}" 
     ng-model="field.value" 
     required> 

DEMO

問題的說明:

默認情況下,使用ngModelController輸入元素(ng-model)調用FormController.$addControl當它們與自身註冊並暴露在FormController屬性與輸入的name屬性在這種情況下爲{{ field.name }}。因此,即使控制已註冊,但你沒有暴露在FormController性質名爲emailfirstName,你只有{{ field.name }}引用最後一個輸入項

解決方案的說明:

在此解決方案中,我創建了一個自定義僞指令,以便在運行時用正確的名稱替換{{ field.name }}

我爲什麼要使用terminal:true,priority:1000,看看這個討論的更多信息:Add directives from directive in AngularJS

+1

一個孤立的範圍可以用來代替範圍。$ eval:'scope:{dynamicName:'='}'在指令配置中就是'scope。動態名稱'內'鏈接'。 –

+1

@ Hugo Wood:我認爲我們不需要在這裏隔離範圍。這個指令的目的是'根據'當前作用域'修改當前元素'。使用當前的範圍更適合IMO。 –

+0

可以動態地循環顯示錯誤消息嗎?他們在演示中被硬編碼 – sisimh