2016-03-15 129 views
1

我有一個基於所傳入的數據生成表單項目綁定嵌套對象

我們支持可能字段類型,但是,例如,這裏是input模板:

<label> 
    {{fieldSchema.label}} 
    <input type="{{fieldSchema.attributes.type}}" 
      name="{{fieldSchema.attributes.name}}" 
      ng-model="model[ fieldSchema.attributes.name ]" /> 
</label> 

這對於平板機型的偉大工程,但如果模型嵌套,它分崩離析,如:

$scope.model = { 
    manager: { 
     first_name: 'John' 
    } 
} 
$scope.fieldSchema.attributes.name = 'manager.first_name'; 

是否有使用方式$parse$interpolate或類似的ng-model?我見過如何在這個結構中獲取數據的示例,但我一直無法找到雙向綁定解決方案。

(注:採用了棱角分明的版本1.5.0)

編輯:這裏是一個普拉克,希望這使得它更加清晰。 http://plnkr.co/edit/4E8jlsnuy5HkCZPxSf5z?p=preview

+0

我可以知道你的輸入模板是如何渲染的嗎? –

+0

我正在抓取一個HTML模板(基於'fieldSchema'中的內容),並使用'element.html(html);' –

+0

根本不清楚具體問題是什麼。演示會幫助 – charlietfl

回答

0

我最終做了Amit在評論中提出的建議。謝謝,阿米特!

首先,我在指令創建一個getter/setter函數:

function getterSetter(newValue) { 

    var getter = $parse('model.' + $scope.wxFormField.attributes.name), 
     setter = getter.assign; 

    return arguments.length ? setter($scope, newValue) : getter($scope); 
} 

然後,我改變了ng-model到該功能,並添加了ng-model-options指令。

<label> 
    {{fieldSchema.label}} 
    <input type="{{fieldSchema.attributes.type}}" 
      name="{{fieldSchema.attributes.name}}" 
      ng-model="formFieldFunctions.getterSetter" 
      ng-model-options="{ getterSetter: true }" /> 
</label> 
1

如果模板輸入模板html可以通過代碼控制,那麼在呈現/附加HTML到DOM之前,請按照以下方式進行操作。

ng-model="model[fieldSchema.attributes.name]" 

ng-model="model['manager']['first_name']" 

代碼

function createNgModel(model){ 
    var values = model.split('.') 
    //and then create a format it do have below format 
    //model['manager']['first_name'] 
}; 

var template = '<label>'+ 
    '{{fieldSchema.label}}'+ 
    '<input type="{{fieldSchema.attributes.type}}"'+ 
      'name="{{fieldSchema.attributes.name}}"'+ 
      'ng-model="+ createNgModel(fieldSchema.attributes.name) +" />'+ 
'</label>'; 

或者說一個很好的選擇將只是通過附加返回fieldSchema.attributes.name字符串值由@Amit的意見建議

var template = '<label>'+ 
    '{{fieldSchema.label}}'+ 
    '<input type="{{fieldSchema.attributes.type}}"'+ 
      'name="{{fieldSchema.attributes.name}}"'+ 
      'ng-model="model.'+ fieldSchema.attributes.name+'" />'+ 
'</label>'; 
+0

這適用於一個領域,但我有幾十個,在'ng-repeat'中,並不是所有的都在'manager'字段下。 –

+0

哦,我明白你在說什麼......我寧願不把所有的模板都移到指令中,但我想這是一個選項。 –

+0

@MattGrande查看更新後的答案...按照Amit的評論 –