AlloyUI表单生成器尝试访问动态创建的元素

时间:2014-05-14 11:50:26

标签: javascript xml bounding-box formbuilder alloy-ui

我使用AlloyUI表单构建器构建了一个动态表单。我想捕捉我在边界框中拖放的元素。 我遇到过这样的事情:

function saveFieldsForm(){
    var formXML ='';

myFormBuilder.get('fields').each(
function(item, index, collection) {
    var dataType = item.get('dataType'),
        indexType = item.get('indexType'),
        label = item.get('label'),
        multiple = item.get('multiple'),
        name = item.get('name'),
        options = item.get('options'),
        readOnly = item.get('readOnly'),
        repeatable = item.get('repeatable'),
        required = item.get('required'),
        showLabel = item.get('showLabel'),
        type = item.get('type'),
        tip = item.get('tip'),
        predefinedValue= item.get('predefinedValue'),
        width = item.get('width');

    var fieldXML = '<field>';
    fieldXML += '<type>' + type + '</type>';
    fieldXML += '<name>' + name + '</name>';
    fieldXML += '<required>' + required + '</required>';
    fieldXML += '<tip>' + tip + '</required>';
    fieldXML += '<predefinedValue>' + predefinedValue + '</predefinedValue>';        
    fieldXML += '</field>';
    alert("fieldXML: "+ fieldXML);
    formXML += fieldXML;
});

formXML += '</root>';
 alert("formXML: "+ formXML);

 AUI().use('aui-io-request',
            function(A) {           

        A.io.request(
            '<%=ajaxURL%>',{
                data: {                         

                    formXML : formXML,

                },
                dataType: 'json',
                on: {                                                                                            
                        success: function(data) {   
                            alert("Your form has been saved!")

                        },

                        error: function(jqXHR, textStatus, errorThrown) {

                            alert("Error, the content has not been saved! Please try again...");    
                            console.log(textStatus, errorThrown);                       

                            }           
                    }
            });    
            }); 

}

在上面的代码中我理解拖拽和删除的字段正在被捕获但我不理解第二行代码中函数内的项目,索引和集合字段。这些价值是什么以及这些价值从何而来? 请帮忙!!!

1 个答案:

答案 0 :(得分:2)

myFormBuilder.get('fields')会返回Alloy UI ArrayList,这是您获得each功能的地方。 callback的参数来自ArrayList的“内部”。

我最近使用了表单构建器并以非常类似的方式捕获了我的表单。但是,我将我保存为JSON

var formDefinition = [];

var parser = function(fields, container){
  fields.each(function(item, index) {
    var surveyElement = {};
    var properties = item.getProperties();

    properties.forEach(function(property) {
      var attr = property.attributeName;
      surveyElement[attr] =  item.get(attr); 
    })
    surveyElement.name = item.get('name');

    var children = item.getAttrs()['fields']
    if(children && children.size() > 0){
      surveyElement.children = [];
      parser(children, surveyElement.children);
    }

    container.push(surveyElement);
  });
 }

parser(formBuilder.get('fields'), formDefinition);
var json = JSON.stringify(formDefinition)
  • itemeach函数提供的“当前”项目。
  • index是该项目在其边界元素内的深度位置

我没有使用collection参数,因此我不得不进行调查。看来该集合表示特定边界元素内item深度相同的所有元素。换句话说,如果item嵌套在其他元素中,则集合的范围仅限于parent

实施例

  • 文字框
    • Checkbox 1
    • Checkbox 2
  • 收音机按钮
    • Checkbox 3

想象一下,each提供了Text Box。这将是itemindex为0,collection将是一个包含两个元素的ArrayList(为简单起见,我将使用javascript语法)[{formElement: Text Box},{formElement: Radio Buttons}]。接下来,each提供Checkbox 1index将再次为0,因为这是此“深度”的第一个元素,因为它在Text Box内,collection只会包含Checkbox 1和{{1} }。 Checkbox 2然后提供eachCheckbox 2现在为1,index保持不变。

collection将一直持续到遍历所有表单元素。