如何保存和恢复 AlloyUI FormBuilder 字段?

How can I save and restore AlloyUI FormBuilder fields?

我想保存 AlloyUI 的用户选择和预定义字段 FormBuilder。我尝试使用 JSON.stringify(formBuilder.get('fields')),但出现以下错误:

Uncaught TypeError: Converting circular structure to JSON

如何保存(和恢复)AlloyUI 的字段FormBuilder

为了保存AlloyUI的字段FormBuilder,可以使用field.getAttributesForCloning()获取重要的字段属性。然后你可以将这些属性组合成一个数组。最后,您可以将数组转换为 JSON 以将其保存为 JSON.stringify():

var fields = [];
formBuilder.get('fields').each(function(field) {
    fields.push(field.getAttributesForCloning());
});
fields = JSON.stringify(fields);

如果要恢复字段,可以在 JSON:

上使用 JSON.parse()
new Y.FormBuilder({
    /* ...your code here... */
    fields: JSON.parse(fields)
}).render();

这是一个使用 AlloyUI's example FormBuilder code 的可运行示例:

YUI().use('aui-form-builder', function(Y) {
  var formBuilder = new Y.FormBuilder({
    availableFields: [{
      iconClass: 'form-builder-field-icon-text',
      id: 'uniqueTextField',
      label: 'Text',
      readOnlyAttributes: ['name'],
      type: 'text',
      unique: true,
      width: 75
    }, {
      hiddenAttributes: ['tip'],
      iconClass: 'form-builder-field-icon-textarea',
      label: 'Textarea',
      type: 'textarea'
    }, {
      iconClass: 'form-builder-field-icon-checkbox',
      label: 'Checkbox',
      type: 'checkbox'
    }, {
      iconClass: 'form-builder-field-icon-button',
      label: 'Button',
      type: 'button'
    }, {
      iconClass: 'form-builder-field-icon-select',
      label: 'Select',
      type: 'select'
    }, {
      iconClass: 'form-builder-field-icon-radio',
      label: 'Radio Buttons',
      type: 'radio'
    }, {
      iconClass: 'form-builder-field-icon-fileupload',
      label: 'File Upload',
      type: 'fileupload'
    }, {
      iconClass: 'form-builder-field-icon-fieldset',
      label: 'Fieldset',
      type: 'fieldset'
    }],
    boundingBox: '#myFormBuilder',
    fields: [{
      label: 'City',
      options: [{
        label: 'Ney York',
        value: 'new york'
      }, {
        label: 'Chicago',
        value: 'chicago'
      }],
      predefinedValue: 'chicago',
      type: 'select'
    }, {
      label: 'Colors',
      options: [{
        label: 'Red',
        value: 'red'
      }, {
        label: 'Green',
        value: 'green'
      }, {
        label: 'Blue',
        value: 'blue'
      }],
      type: 'radio'
    }]
  }).render();

  Y.one('#resetFormBuilder').on('click', function(event) {
    var fields = [];
    formBuilder.get('fields').each(function(field) {
      fields.push(field.getAttributesForCloning());
    });
    fields = JSON.stringify(fields);
    formBuilder.destroy();
    event.target.set('style', 'display: none;');
    new Y.FormBuilder({
      /* ...your code here... */
      boundingBox: '#myFormBuilder',
      fields: JSON.parse(fields)
    }).render();
  });
});
<script src="http://cdn.alloyui.com/3.0.1/aui/aui-min.js"></script>
<link href="http://cdn.alloyui.com/3.0.1/aui-css/css/bootstrap.min.css" rel="stylesheet"></link>
<div class="yui3-skin-sam">
  <button id="resetFormBuilder" class="btn btn-primary">
    Reset <code>FormBuilder</code>
  </button>
  <div id="wrapper">
    <div id="myFormBuilder"></div>
  </div>
</div>