我想在我的表单中添加一个微调器/加载器。情节很简单,当我点击create
按钮时,它会显示一个微调器/加载器。在点击创建按钮时,会调用web服务,因此微调器/加载器将从调用开始显示到调用结束。
以下是我的控制器
$m = MetersInventoryStore::findOne($_REQUEST['selected_meters']);
$msn = $m->meter_serial; // current selected meter serial number is saved
$date_time = str_replace(' ', 'T', date('Y-m-d H:i:s')); // current date time
$api_url = 'http://xx.xxx.xxx.xxx:7000/api/meters/GetByMsn/' . $msn . '/' .$date_time; // my base URL
$curl = curl_init($api_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization:key'));
$curl_response = curl_exec($curl);
$json = json_decode($curl_response);
$meter_alive = $json->data->Response;
.
.
.
.
// my other code that is saving data
.
.
.
.
return $this->render('create', ['model' => $model,]);
提交按钮位于
下方<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Verify Communication' : 'Update', ['id'=> 'spin','name'=>'create','class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-success']) ?>
</div>
如上所述,当我按下Verify Communication
按钮时,会调用Web服务,在此期间我想显示一个微调器/装载器。
为了创建/显示微调器/加载器,我搜索了许多文章。
但上述文章均未提及完整的实施细节。虽然我已经尝试了文章中提到的每一个步骤。
任何帮助都将受到高度赞赏。
答案 0 :(得分:0)
为什么不将提交器放在提交按钮上,而不是将其放在提交页面上。可以通过更改主布局来完成。
<style>
/*loader css*/
#loader {
position: absolute;
left: 50%;
top: 50%;
z-index: 1;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border: 16px solid #f3f3f3;
border-radius: 50%;
border-top: 16px solid #3498db;
width: 120px;
height: 120px;
-webkit-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
}
@-webkit-keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Add animation to "page content" */
.animate-bottom {
position: relative;
-webkit-animation-name: animatebottom;
-webkit-animation-duration: 1s;
animation-name: animatebottom;
animation-duration: 1s
}
@-webkit-keyframes animatebottom {
from { bottom:-100px; opacity:0 }
to { bottom:0px; opacity:1 }
}
@keyframes animatebottom {
from{ bottom:-100px; opacity:0 }
to{ bottom:0; opacity:1 }
}
</style>
添加功能脚本。
<script>
var myVar;
function myFunction() {
myVar = setTimeout(showPage, 0000);
}
function showPage() {
document.getElementById("loader").style.display = "none";
document.getElementById("container").style.display = "block";
}
</script>
最后,通过将onload函数与body绑定来调用函数。
<body onload="myFunction()">
<div id="loader"></div>
<section id="container" style="display:none;" class="animate-bottom">
</section>
</body>
答案 1 :(得分:0)
未根据用户请求进行验证
$m = MetersInventoryStore::findOne($_REQUEST['selected_meters']);
太多了
$msn = $m->meter_serial;
执行此操作
$api_url = 'http://xx.xxx.xxx.xxx:7000/api/meters/GetByMsn/' . $m->meter_serial . '/' .$date_time;
卷曲请求需要移到单独的方法
function curlRequest(msn) {
$api_url = 'http://xx.xxx.xxx.xxx:7000/api/meters/GetByMsn/' . $msn . '/' .$date_time; // my base URL
$curl = curl_init($api_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization:key'));
$curl_response = curl_exec($curl);
$json = json_decode($curl_response); // WTF snake case only in Python
return $json->data->Response;
}
现在回答您的问题 您需要向按钮添加点击事件。您使用Yii2拥有jQuery,可以使用更强大的DOM工具。为按钮类使用$ .hide()和$ .show()并绘制预加载器。如果您需要服务器提供有关其保存数据的反馈,则可以使用Promise。