2017-03-14 36 views
1

這是一個虛構的例子,我有一個包含多個表單的巨大模板,我想標記已經觸及輸入的部分。在指令中獲取元素的ng模型值

<section my-directive> 
    <form name="user"> 
    <input type="text" ng-model="someCtrlAlias.data.firstname"> 
    <input type="text" ng-model="someCtrlAlias.data.lastname"> 
    </form> 
</section> 

<section my-directive> 
    <form name="address"> 
    <input type="text" ng-model="someCtrlAlias.data.street"> 
    <input type="text" ng-model="someCtrlAlias.data.zipcode"> 
    </form> 
</section> 

我想檢查每個輸入字段,如果它已被觸摸。基本上,$ dirty有什麼作用,但問題是用戶可以保存並稍後繼續,因此$ dirty會消失。我不想將子表單分成data1.firstname,data2.street,因爲之後我需要在將它們保存到數據庫時刪除這些字段。

我已經試過這樣:

angular.forEach element.find('input'), (input) -> 
    $input = angular.element(input) 
    name = $input.attr('name') 
    console.log name, "=>", $input.attr('ng-model') 

$input.attr('ng-model')只是表明我的分配模型的名稱。我可以將整個Object傳遞給指令並從那裏訪問屬性,例如myModel[$input.attr('ng-model').replace("myController.", "")]但這似乎效率低下。

+0

什麼是您的指令包含哪些內容?由於它在'form'元素上,因此它可以訪問['FormController'](https://docs.angularjs.org/api/ng/type/form.FormController),它有'$ setDirty()方法「 '和'$ setPristine()'。你也可以通過使用form [inputName]來獲得它的元素的ng模型。 –

回答

0

獲取形式的範圍:

$form = element.find('form') 
formName = $form.attr('name') 
formScope = $form.scope()[$form.attr('name')] 

所有角鍵有$剩下的似乎只有我的模型:

keys = Object.keys(formScope).filter((key)-> return key.indexOf('$') == -1).filter((key)-> return formScope[key].$modelValue?) 
if keys.length > 0 
    console.log "#{formName} is set dirty" 
    formScope.$setDirty(true)