1. 程式人生 > >Mustache動態載入選擇框

Mustache動態載入選擇框

一、簡單示例

程式碼:

複製程式碼
 1             function show(t) {
 2                 $("#content").html(t);
 3             }
 4 
 5             var view = {
 6                 title: 'YZF',
 7                 cacl: function () {
 8                     return 6 + 4;
 9                 }
10             };
11             $("#content").html(Mustache.render("{{title}} spends {{cacl}}", view));
複製程式碼

結果:

YZF spends 10

結論:

可以很明顯的看出Mustache模板的語法,只需要使用{{和}}包含起來就可以了,裡面放上物件的名稱。

通過本示例也可以看出,如果指定的屬性為函式的時候,不會輸出函式裡面的內容,而是先執行函式,然後將返回的結果顯示出來。

 二、不轉義html標籤

程式碼:

複製程式碼
1             var view = {
2                 name: "YZF",
3                 company: "<b>ninesoft</b>"
4             };
5             show(Mustache.render("{{name}} <br /> {{company}} <br />{{{company}}}<br/>{{&company}}", view));
複製程式碼

 結果:

結論:

通過這個示例可以看出Mustache預設是會將值裡面的html標記進行轉義的,但是有時候我們並不需要。

所以這裡我們可以使用{{{和}}}包含起來,或者是{{&和}}包含,那麼Mustache就不會轉義裡面的html標記。

三、繫結子屬性的值

程式碼:

複製程式碼
1             var view = {
2                 "name": {
3                     first: "Y",
4                     second: "zf"
5                 },
6 "age": 21 7 }; 8 show(Mustache.render("{{name.first}}{{name.second}} age is {{age}}", view));
複製程式碼

 結果:

結論:

相信看到第一個示例的時候,就會有人想到能不能繫結子屬性,如果你努力看下去了。

那麼祝賀你,現在就是解決你的需求的方式,僅僅只需要通過.來使用子屬性即可。

四、條件式選擇是否渲染指定部分

程式碼:

1             var view = {
2                 person: false
3             };
4             show(Mustache.render("eff{{#person}}abc{{/person}}", view));

 結果:

結論:

問題總是不斷,如果我們還需要能夠根據我們給的值,決定是否渲染某個部分。

那麼現在就可以解決這個問題,當然還要提示的就是不僅僅是false會導致不渲染指定部分。

null,空陣列,0,空字串一樣有效。語法上面比較簡單,就是使用{{#key}} ... {{/key}}

來控制中間的內容。

五、迴圈輸出

程式碼:

複製程式碼
1             var view = {
2                 stooges: [
3                     { "name": "Moe" },
4                     { "name": "Larry" },
5                     { "name": "Curly" }
6                 ]
7             };
8             show(Mustache.render("{{#stooges}}{{name}}<br />{{/stooges}}", view));
複製程式碼

結果:

結論:

僅僅學會上面的方式,大部分地方你都解決了,但是還是會出現麻煩的地方。

就是迴圈輸出,如果你一個一個寫,相信會很煩躁,當然Mustache不會讓我們失望,

它也給出瞭如何迴圈輸出的方式,這裡是將一個由物件組成的陣列輸出,如果我們

輸出的是陣列,就需要使用{{.}}來替代{{name}}。

六、迴圈輸出指定函式處理後返回的值

程式碼:

複製程式碼
 1             var view = {
 2                 "beatles": [
 3                     { "firstname": "Johh", "lastname": "Lennon" },
 4                     { "firstname": "Paul", "lastname": "McCartney" }
 5                 ],
 6                 "name": function () {
 7                     return this.firstname + this.lastname;
 8                 }
 9             };
10             show(Mustache.render("{{#beatles}}{{name}}<br />{{/beatles}}", view));
複製程式碼

 結果:

結論:

迴圈輸出是有了,但是我們還想後期進行加工。那麼這個完全符合你的需要,因為Mustache會將

陣列中的值傳遞給你的函式,輸出你函式返回的值。這裡我們可以看到最外層是陣列,只要在裡面

使用函式那麼外層的陣列就會作為這個函式的引數傳遞進去。

七、自定義函式

程式碼:

複製程式碼
1             var view = {
2                 "name": "Tater",
3                 "bold": function () {
4                     return function (text, render) {
5                        return render(text) + "<br />";
6                     }
7                 }
8             }
9             show(Mustache.render("{{#bold}}{{name}}{{/bold}}", view));
複製程式碼

 結果:

結論:

上面我們都是用的變數作為節,那麼我們現在用函式作為節,會有什麼效果呢。

它會呼叫我們函式返回的函式,將節中間的原始字串作為第一個引數,預設

的直譯器作為第二個引數,那麼我們就可以自行加工。

八、反義節

程式碼:

1 var view = {
2                 "repos": []
3             };
4             show(Mustache.render("{{#repos}}{{.}}{{/repos}}{{^repos}}no repos{{/repos}}", view));

 結果:

結論:

上面我們也用節,但是僅僅只能選擇是否輸出某個部分。所以這裡我們彌補一下。

如果我們使用了{{^和}}來定義節的話,那麼這個部分只會在裡面的值為空,null,

空陣列,空字串的時候才會顯示。那麼我們就可以實現了if else的效果了。

九、部分模板

程式碼:

複製程式碼
 1             var view = {
 2                 names: [
 3                     { "name": "y" },
 4                     { "name": "z" },
 5                     { "name": "f" }
 6                 ]
 7             };
 8             var base = "<h2>Names</h2>{{#names}}{{>user}}{{/names}}";
 9             var name = "<b>{{name}}</b>";
10             show(Mustache.render(base, view, { user: name }));
複製程式碼

 結果:

結論:

Mustache雖然節約了很多時間,但是我們定義了很多模板,但是彼此之間無法互相巢狀使用,也會造成繁瑣。

所以這裡我們還要介紹如何定義部分模板,用來在其他模板裡面使用,這裡使用其他模板的方式僅僅是{{>templetename}}。

最大的不同就是Mustache.render方法有了第三個引數。

十、預編譯模板

程式碼:

1             Mustache.parse(template);
2             //其他程式碼
3             Mustache.render(template,view);

結論:

模板既然有好處,也有壞處。就是編譯模板需要時間,所以在我們已知會使用某個模板的前提下,我們可以預先編譯好這個模板,以便後面的使用。

<%@ page pageEncoding="UTF-8"%>
<%@ include file="/pages/common/tags.jsp"%>


<!DOCTYPE html>
<html lang="zh-CN">
<head>
<%@ include file="/pages/common/meta.jsp" %>
</head>
<div class="eaxm-area-manage">
<form id="formEdit" action="" class="m-form">
<div class="f-fixed">
<div class="f-fl" style="width:100%;">
<ul>
<input type="hidden" name="groupID" value="${group.groupID }">
<input type="hidden" id="typeID" value="${group.typeID }">
<input type="hidden" name="schoolID" >
<input type="hidden" name="schoolName">
<li class="form-item">
<label for="" class="title">圈子名稱:</label>
<div class="con">
<input type="text" id="groupName" name="groupName" value="${group.groupName }" <c:if test="${not empty type.groupID}">readonly="readonly"</c:if>  required validate="true">
</div>
</li>
<li class="form-item">
<label for="" class="title">圈子類別:</label>
<div class="con">
<input <c:if test="${empty group.typeFlag or group.typeFlag == 1}">checked="true"</c:if>  type="radio" name="typeFlag" value="1">官方</input>
<input <c:if test="${group.typeFlag == 2 }">checked="true"</c:if>  type="radio" name="typeFlag" value="2">普通</input>
<input <c:if test="${group.typeFlag == 3 }">checked="true"</c:if> type="radio" name="typeFlag" value="3">學校</input>
</div>
</li>
<li class="form-item">
<label for="" class="title">圈子分類:</label>
<div class="con">
<select name="typeID" required validate="true" class="J_typeID">
<option value="">請選擇</option>
</select>
</div>
</li>
<li class="form-item">
<label for="" class="title">驗證標記:</label>
<div class="con">
<input <c:if test="${empty group.verifyFlag or group.verifyFlag == 3 }">checked="true"</c:if> type="radio" name="verifyFlag" value="3">允許任何人</input>  
</div>
</li>
<li class="form-item">
<label for="" class="title">熱門標記:</label>
<div class="con">
<input <c:if test="${empty group.isHot or group.isHot == 0}">checked="true"</c:if>  type="radio" name="isHot" value="0">否</input>
<input <c:if test="${group.isHot == 1 }">checked="true"</c:if> type="radio" name="isHot" value="1">是</input>
</div>
</li>
<li class="form-item">
<label for="" class="title">停用標記:</label>
<div class="con">
<select name="stopFlag" required>
<option value="1" <c:if test="${group.stopFlag == 1}">selected</c:if>>啟用</option>
<option value="2" <c:if test="${group.stopFlag == 2}">selected</c:if>>禁用</option>
</select>
</div>
</li>
<li class="form-item">
<label for="" class="title">圖示:</label>
<div class="con">
<input type="hidden" name="iconURL" id="icon" value="${group.iconURL}" readonly required>
<input type="button" id="fileup-mainUrl">(只允許上傳png的檔案)
<div id="progress-files" class="f-dn"></div>
</div>
</li>

<li class="form-item" id="J_school" <c:if test="${empty group.typeFlag or group.typeFlag == 1 or group.typeFlag == 2 }">style="display:none;"</c:if> >
<label for="" class="title">所屬學校:</label>
<div class="con">
<select name="schoolID" required>
<option value="">請選擇</option>
<c:forEach items="${schoolList}" var="item">
<option value="${item.schoolId}" <c:if test="${item.schoolId == group.schoolID}">selected</c:if>>${item.schoolName}</option>
</c:forEach>
</select>
</div>
</li>

<input type="text" style="display:none" id="provCityName" name="provCityName" value="" readonly>
<li class="form-item" id="J_putong" <c:if test="${empty group.typeFlag or group.typeFlag == 1 or group.typeFlag == 3 }">style="display:none;"</c:if> >
<label for="" class="title">所在地區:</label>
<input type="text" style="display:none" id="cityCodeHidden" value="${group.cityCode}" readonly>
<div class="con">
<select id="proviceCode" name="proviceCode" required>
<c:forEach items="${zoneList}" var="zone">
<option value="${zone.zoneNo}" <c:if test="${zone.zoneNo == group.proviceCode}">selected</c:if>>${zone.zoneName}</option>
</c:forEach>
</select>

<select id="cityCode" name="cityCode" required>
<!-- <option value="">請選擇</option> -->
</select>
</div>
</li>
<li class="form-item">
<label for="" class="title">備註:</label>
<div class="con">
<textarea name="remark" id="remark" style="font-size:100%;" >${group.remark}</textarea>
</div>
</li>
</ul>
</div>
</div>
<div class="p-center">
<input type="button" value="儲存" class="u-btn u-btn-nm u-btn-orange J_edit_save">
</div>
</form>
</div>

<textarea id="tableRowTpl" class="f-hide">
<option value="">請選擇</option>
{{#typeList}} 
<option value="{{typeID}}" data-schoolID="{{schoolID}}"  data-schoolName="{{schoolName}}">{{typeName}}</option>
{{/typeList}} 
</textarea> 
<script>
seajs.use('hulaquan/groups/group/groupEdit');
</script>
</body>
</html>


define(function(require, exports, module) {
var $ = require('jquery');
var Utils = require('utils');
var validator = require('validator');
var SWFUpload=require("fileupload");
var FileProgress = require('fileprogress');
var Dialog = require('dialog');
var Mustache = require('mustache');
var groupEdit = {
init : function() {
this.initTpl();//初始化模板
this.bindEvent();//繫結事件
this.initData();
this.initUploadFile("fileup-mainUrl","icon","*.png","1");
$('#formEdit').initValidator();
},
initTpl : function(){
this.tableRowTpl = $("#tableRowTpl").val();
},
initData : function(){
var _this = this;
var typeFlag = $(' input[name="typeFlag"]:checked ').val(); 
 $.ajax({
type : "get",
url : ctx + "/auth/hulaquan/groups/groupsType/queryGroupType.htm",
data:{typeFlag : typeFlag , businessType:2 },
dataType : "json",
success : function(json) {
var output = Mustache.render(_this.tableRowTpl, json.datas);
$('.J_typeID').html(output);
var typeID = $('#typeID').val();
$('.J_typeID').val(typeID);
}
});
},
bindEvent : function() {
var _this = this;

$(function (){
getCity();
})

$("#proviceCode").change(function(){
 getCity();
});

function getCity() {
var provCode = $("#proviceCode").val();
$.ajax({
type : "POST",
url : ctx + "/auth/hulaquan/groups/group/city.htm",
dataType : "json",
data:{paZoneNo:provCode},
success : function(json) {
if (json.success) {
$("#cityCode").empty();
$.each(json.datas.cityList , function (n, city) {
var cityCode = $("#cityCodeHidden").val();
var city_html ="";
if (city.zoneNo == cityCode) {
city_html = "<option value='" + city.zoneNo +"' selected> "+city.zoneName +"</option>";
}else{
city_html = "<option value='" + city.zoneNo +"'> "+city.zoneName +"</option>";
}
$("#cityCode").append(city_html);
});

} else {
Utils.Notice.error(json.message);
}
},
});
}

//
$("input[name=typeFlag]").on("click",function(){
var $val = $(this).val();
if($val==1){
$("#J_putong").hide();
}else if($val==2){
$("#J_putong").show();
}else if($val==3){
$("#J_putong").hide();
}
});

//根據選擇類別冗餘學校id,名稱
$("select[name=typeID]").on("click",function(){
var typeID = $('.J_typeID option:selected').val(); 
var typeFlag = $(' input[name="typeFlag"]:checked ').val(); 
if (typeFlag == 3) {//類別是學校
var schoolID = $('.J_typeID option:selected').attr('data-schoolID');
var schoolName = $('.J_typeID option:selected').attr('data-schoolName');
$("input[name='schoolID']").val(schoolID);
$("input[name='schoolName']").val(schoolName);
} else {
$("input[name='schoolID']").val('');
$("input[name='schoolName']").val('');
}
});

//圈子分類資料獲取
$("input[name='typeFlag']").change(function(){
var typeFlag = $(' input[name="typeFlag"]:checked ').val(); 
 $.ajax({
type : "get",
url : ctx + "/auth/hulaquan/groups/groupsType/queryGroupType.htm",
data:{typeFlag : typeFlag , businessType:2 },
dataType : "json",
success : function(json) {
var output = Mustache.render(_this.tableRowTpl, json.datas);
$('.J_typeID').html(output);
}
});
});

//儲存
$('.J_edit_save').click(function(e){
e.preventDefault();
var provName = $("select[name='proviceCode']").find("option:selected").text();
var cityName = $("select[name='cityCode']").find("option:selected").text();
$("#provCityName").val(provName + cityName);
var $btn = $(this);
var bValidate = $('#formEdit').validate();
if(!bValidate) {
return;
} 
var groupName = $("#groupName").val();
if (groupName.length > 15) {
Utils.Notice.alert("圈子的名稱長度最大不超過15個字");
return;
}
var remark = $("#remark").val();
if (remark.length > 1020) {
Utils.Notice.alert("備註的長度最大不超過1020個字");
return;
}
if ($btn.attr('isC') == '1') {
return;
}
$btn.attr('isC','1');

$.ajax({
type : "POST",
url : ctx + "/auth/hulaquan/groups/group/saveGroup.htm",
dataType : "json",
data:$('#formEdit').serialize(),
beforeSend:function(){
$btn.addClass('u-btn-gray');
$btn.val('儲存中...');
},
success : function(json) {
if (json.success) {
Utils.Notice.alert(json.message);
setTimeout(function(){
Dialog.submit('group-edit','submit');
},700);
} else {
Utils.Notice.error(json.message);
}
},
complete:function(){
$btn.attr('isC','0');
$btn.removeClass('u-btn-gray');
$btn.val('儲存');
}
});
});
},

initUploadFile : function(fileUp, filePath, fileType, fileMaxNum){
       var ticket = $('#jTicket').val();
    //附件數量
    self._fu = SWFUpload.createFileUpload({
    context: ctx, 
    upload_url: fileCenterSN + '/common/student/stu_file_upload.htm?ticket=' + ticket,
    button_placeholder_id: fileUp,
    file_size_limit: '15MB',
    file_types: fileType,
    file_types_description: '檔案',
    file_post_name: 'file',
    file_upload_limit: fileMaxNum,
    file_queue_limit: 1,
    custom_settings : {
    progressTarget : 'progress-files'
    }
    }, FileProgress, {
    deleteFile: function(datas) {
    $('#'+filePath).val('');
    },
    uploadSuccess: function(datas) {
    var stats = self._fu.getStats();
    stats.successful_uploads = 0; 
    self._fu.setStats(stats);
    $('#'+filePath).val(datas.longUrl);
    var tid = new Date().getTime();
    },
    onError: function(msg) {
    Utils.Notice.error(msg);
    }
    });
}

};
groupEdit.init();
});


喜歡的朋友可以掃描我的個人公眾號,有好東西可以一起分享。

也可以微信搜尋公眾號:Java程式設計師那些事

相關推薦

Mustache動態載入選擇

一、簡單示例 程式碼: 1 function show(t) { 2 $("#content").html(t); 3 } 4 5 var vie

AJAX經典應用之動態載入列表

動態載入列表框在許多場景中都需要用到。 比如說當用戶選擇了某幾項選項之後,會自動根據使用者的選擇來動態載入列表框。下面要講的就是這樣一個例子。 注意事項: 增加新的節點需要從下往上依次加進去 dynamicList.html <!DOCTYPE html> &

Ajax動態載入列表

1.dynamicLists.html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"

簡單知識點例項之二:如何動態生成div並且同時非同步載入資料

一、動態生成框並且同時ajax非同步請求資料 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <htm

JQuery中使用select2外掛功能之自動完成下拉動態載入匹配(本地資料與遠端資料結合)

前言 最近專案中遇到一個問題:前端載入頁面的時候某些頁面載入速度很慢,耗時很久;有些頁面載入的飛快;因為上面所說的頁面都是由同一個程式動態生成的,利用多執行緒同步機制完成不同的前端頁面;因此當時就斷定不是程式的大問題;應該是處理資料部分存在問題;在chrome瀏覽器一測;還真的是大資料的問題

Dva 使用antd的Cascader動態獲取樹形省市區聯級選擇的完整元件

效果圖: 就是實現這樣的,選擇框的時候,將向後臺請求省的資料,當點選省的時候,就會請求當前點選市的資料 。。。。,請求的介面只有一個,傳值為code值。樹形的資料。 完整的元件程式碼: import React, { Component } from 'react'

jqGrid 單元格編輯 自定義下拉選擇 動態資料來源 通用實現

jqGrid編輯型別可分為:單元格編輯(Cell editing)、行內編輯(Inline editing)和表單編輯(Form editing),本文討論單元格編輯模式下,下拉選擇框的通用實現。jqGrid自帶下拉選擇框編輯型別,只要設定edittype='select’並設定editop

解決layui動態載入複選無法選中

問題描述 1.最近用layui做後臺介面,遇到layui跟ajax資料動態載入的checkbox,偶爾不能正常勾選,取消 2.有分頁時,最後一頁資料過少會導致其他頁下方資料無法選中 3.頁面沒載入完或暴力測試時也會不能選中 利用layui更新渲染方法和網上的一些方法去解決後極大的

layer 彈窗 載入選擇

首先依賴jquery 1.alert layer.alert("顯示資訊"); // 最基本的 layer.alert("顯示資訊", { icon: 0 , // 0~6 t

使用ajax動態載入select下拉

本例子只是模擬一個動態獲取select值的過程,資料從xml獲取,當然你也可以從servlet、struts的action獲取,不多說看程式碼 1、student.xml <?xml version="1.0" encoding="UTF-8"?> <stu

使用ajax從資料庫動態載入下拉(select)資料,可編輯下拉

<div style="position:relative;"> <span style="margin-left:100px;width:18px;overflow:hidden;"> <select id="ch

javascript實現兩個select選擇內容動態繫結

1. 有時候需要實現當用戶選擇一個選項之後,網頁上另一部分的內容就隨之變化,達到動態更新的目的,這時候我們就會想到ajax來實現區域性重新整理,接下來用一個簡單的例子演示:總共有兩個select選擇框,第一個是省份的選擇,第二個是對應省份的城市的選擇,目標是實現當用戶切換省

通過ajax動態載入select控制元件【下拉】的option

一、JS方式 關鍵程式碼: <select id="ddlResourceType" onchange="getvalue(this)"></select> var objSelect = document.getElementById("ddlR

兩種動態下拉動態預設選擇

  第一種:  action: HttpServletRequest request = ServletActionContext.getRequest(); this.dwList = this.xlcjDao.findAllByKdm(this.dwdm); jsp

layui下拉動態載入

layui.use(['form', 'upload'] , function () { var $ = layui.jquery , upload = layui.upload

ajax動態載入下拉資料

下拉框—–ajax動態載入資料 嗨!這是我發表的第一篇部落格,希望對大家有所幫助,有什麼不對的地方還望校正! jsp頁面(型別一) <select class="form-control" name="orgName" id="select_

bootstrap 模態動態載入資料

1.頁面中新增modal <!-- 模態框(Modal) --><div class="modal fade" id="showModal" tabindex="-1" role="dialog"    aria-labelledby="myModalL

jquery實現動態載入select下拉

如題,直接上程式碼,實戰學習。 <head><title>jquery實現動態載入select下拉選項</title> <script type="text/javascript"> function init(){ m

extjs4.1 動態載入 checkboxgroup 後checked 為true老是失效的問題+combobo自動選擇特定記錄

剛剛遇到這個問題,官方網上也有這個,不過好像沒有解決。 http://www.sencha.com/forum/showthread.php?228669 { xtype: 'checkboxgroup', fieldL

頁面上動態載入內容(checkbox),選中取消事件

動態載入checkbox之後,選中,取消事件, //動態載入的checkbox內容 var dataObj = $.parseJSON(datas).CGYY;//datas為查找