【问题标题】:Alpaca - Is there a form onReady?羊驼 - 是否有 onReady 表格?
【发布时间】:2020-03-20 22:35:23
【问题描述】:

使用 Alpaca js 我正在尝试动态使用另一种 alpaca 形式的 setValue 我明白了

SyntaxError: JSON.parse: unexpected end of data at line 8 column 5 of the JSON data

我的猜测是它的发生是因为表单尚未呈现?有没有办法设置它的“onReady”功能?

演示场景的简单示例:

$(document).ready(function(){
	createForm("alpacaForm1","firstName","Copy from this form","FORM1 value","string");  
});


function updateForm(){
  createForm("alpacaForm2","firstName","To this form", "FORM2 value","string");      
   $("#alpacaForm2").alpaca().setValue($("#alpacaForm1").alpaca().getValue());

}
function createForm(divName,fieldName,fieldLable,fieldVal,fieldType){

$("#" + divName).alpaca({
    "data": { fieldName: fieldVal },
    "schema": {
        "type": "object",
        "properties": {
            fieldName: {
                "type": fieldType,
                "title": fieldLable
            }
        }
    }
});

}
<!-- jquery -->
        <script type="text/javascript" src="//code.jquery.com/jquery-1.11.1.min.js"></script>
 
        <!-- bootstrap -->
        <link type="text/css" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" />
        <script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
 
        <!-- handlebars -->
        <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.js"></script>
 
        <!-- alpaca -->
        <link type="text/css" href="//cdn.jsdelivr.net/npm/alpaca@1.5.27/dist/alpaca/bootstrap/alpaca.min.css" rel="stylesheet" />
        <script type="text/javascript" src="//cdn.jsdelivr.net/npm/alpaca@1.5.27/dist/alpaca/bootstrap/alpaca.min.js"></script>
        
<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>

<div id="alpacaForm1" ></div>
<div id="alpacaForm2" ></div>
<button onclick="updateForm()">create form 2 and cop from form 1 </button>

【问题讨论】:

    标签: alpacajs


    【解决方案1】:

    postRender 允许在呈现控件时执行操作。

    使用此回调的一种方法是修改 createForm 以接收 postRender 回调函数作为参数并将其配置为表单的选项。

    $(document).ready(function() {
      const postRender = () => {};
      createForm("alpacaForm1", "firstName", "Copy from this form", "FORM1 value", "string", postRender);
    });
    
    
    function updateForm() {
      const postRender = control => control.setValue($("#alpacaForm1").alpaca().getValue());
      createForm("alpacaForm2", "firstName", "To this form", "FORM2 value", "string", postRender);
    }
    
    function createForm(divName, fieldName, fieldLable, fieldVal, fieldType, postRender) {
    
      $("#" + divName).alpaca({
        "data": {
          fieldName: fieldVal
        },
        "schema": {
          "type": "object",
          "properties": {
            fieldName: {
              "type": fieldType,
              "title": fieldLable
            }
          }
        },
        "postRender": postRender
      });
    
    }
    <!-- jquery -->
    <script type="text/javascript" src="//code.jquery.com/jquery-1.11.1.min.js"></script>
    
    <!-- bootstrap -->
    <link type="text/css" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" />
    <script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    
    <!-- handlebars -->
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.js"></script>
    
    <!-- alpaca -->
    <link type="text/css" href="//cdn.jsdelivr.net/npm/alpaca@1.5.27/dist/alpaca/bootstrap/alpaca.min.css" rel="stylesheet" />
    <script type="text/javascript" src="//cdn.jsdelivr.net/npm/alpaca@1.5.27/dist/alpaca/bootstrap/alpaca.min.js"></script>
    
    <script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>
    
    <div id="alpacaForm1"></div>
    <div id="alpacaForm2"></div>
    <button onclick="updateForm()">create form 2 and cop from form 1 </button>

    最小化 DOM 操作的更好方法是转发数据以覆盖第二个表单数据作为 createForm 函数中的参数。

    function createForm(divName, fieldName, fieldLable, fieldVal, fieldType, dataOverrides={}) {
    
      $("#" + divName).alpaca({
        "data": {
          fieldName: fieldVal,
          ...dataOverrides
        },
        "schema": {
          "type": "object",
          "properties": {
            fieldName: {
              "type": fieldType,
              "title": fieldLable
            }
          }
        },
      });
    }
    

    然后在创建第二个表单时从第一个表单传递值。

    function updateForm() {
      const dataOverrides = $("#alpacaForm1").alpaca().getValue();
      createForm("alpacaForm2", "firstName", "To this form", "FORM2 value", "string", dataOverrides);
    }
    

    【讨论】:

    • 有没有办法在羊驼构造函数之外做到这一点?像 div.alpaca().postRender(obj)
    • 不,没有记录为 API
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2023-03-15
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多