KnockoutJS-綁定元素

  工做變動,又走回了WPF,一個來月沒有接觸web開發了,以前的KnockoutJS卻不想放棄,繼續進行知識的鞏固,下個月開始從新走回web開發之路,仍是得用回一些習慣了的工具。本次開始接觸各綁定元素功能、用法,這些綁定方式是在使用ko過程當中用的最多的。javascript

 

綁定元素在KnockoutJS中能夠分爲三大類css

  一、文本控制與顯示隱藏html

  二、流程控制java

  三、配合表單使用git

 

從我的使用過程當中應用程度進行排序展現:web

一、value:在DOM元素與viewModel對象的屬性間創建橋樑,用戶編輯控件時viewModel中對應屬性值將自動更新,一樣在更新了對應屬性後,用戶控件展現數據也將自動更新。經常使用於input、select、textarea等控件;數組

二、text:綁定到DOM元素上,將viewModel對象的屬性的值展現在綁定元素上。經常使用於p、pre、label、span、th、td等控件使用;app

三、click:綁定到DOM元素上添加事件句柄,當點擊事件被觸發時,執行咱們定義好的JS函數。經常使用於button、input、a等控件使用。
函數

  click說明:在綁定函數時,能夠指定任意函數,即在viewModel中聲明的函數和在viewModel以外聲明的函數均可被調用,同時在調用viewModel以內的函數時能夠直接寫函數名,而無需帶上viewModel對象名。工具

四、visible:綁定到DOM元素上,該元素的隱藏或顯示將有viewModel的屬性狀態、函數返回值或表達式來決定。

針對前四個綁定元素,簡單演示一下功能:

Html:

 1 <div>
 2     <label>公司名稱</label>
 3     <input type="text" data-bind="value:unitName" /><br />
 4     <label>公司地址</label>
 5     <input type="text" data-bind="value:address" /><br />
 6     <p data-bind="text:'您的公司名稱爲:'+unitName()+',公司地址是:'+address()+' .'"></p>
 7     <pre data-bind="text:'您的公司名稱爲:'+unitName()+',公司地址是:'+address()+' .'"></pre>
 8     <label data-bind="text:'您的公司名稱爲:'+unitName()+',公司地址是:'+address()+' .'"></label><br />
 9     <span data-bind="text:'您的公司名稱爲:'+unitName()+',公司地址是:'+address()+' .'"></span><br />
10     <table>
11         <tr>
12             <th data-bind="text:unitName"></th>
13         </tr>
14         <tr>
15             <td data-bind="text:address"></td>
16         </tr>
17     </table>
18     <div data-bind="visible:visibleButton">
19         <button data-bind="click: updateUnitName">修改公司名稱爲中部星城科技</button><br />
20         <button data-bind="click: updateAddress">修改公司地址爲湖南長沙雨花區</button>
21     </div>
22     <div>
23         <button data-bind="click:function(){viewModel.visibleButton(false);}">隱藏上面兩個按鈕</button>
24     </div>
25 </div>

JS代碼:

 1 <script type="text/javascript">
 2     var viewModel = {
 3         //value、text
 4         unitName: ko.observable(""),
 5         address: ko.observable(""),
 6 
 7         //click
 8         //viewModel內JS函數
 9         updateAddress: function () {
10             this.address("湖南長沙雨花區");
11         },
12 
13         //visible
14         visibleButton: ko.observable(true),
15     };
16 
17     //任意JS函數
18     function updateUnitName() {
19         viewModel.unitName("中部星城科技");
20     }
21 
22     $(function () {
23         ko.applyBindings(viewModel);//完成綁定
24     });
25 </script>

 動畫效果圖:

 

五、options:該綁定元素只用於在select中使用,經過關聯viewModel中提供的數組,使得select控件可以展現出數組中的全部項。

  options,用於綁定下拉列表中各項(可選參數-optionsCaption,在默認情形下不想選擇任何一個option項時,給予提示語,諸如「---請選擇---」、或「---------」之類的,做爲默認選項,該項的值爲undefined)。

  optionsText,用於肯定下拉列表中每一項的指定屬性做爲展現列,並能夠在此基礎上進行擴展,將指定屬性傳入函數中加工返回新的展現信息,。

  optionsValue,用於肯定下拉列表中每一項的指定屬性做爲標識列。

六、checked:綁定到type爲checkbox的input控件上,關聯viewModel的屬性狀態,相互間的變更都會使得雙方更新狀態,狀態有選中和未選中。僅用於input控件指定類型爲checkbox時使用。

七、css:將一個或多個class動態綁定到DOM元素上,根據具體業務變動綁定的class。經常使用於class之間大範圍樣式的切換,經過設計JS函數完成指定class是否啓用。注意:在設計class時若是存在不合法的命名下,如my-class需轉換爲‘my-class’。

八、style:做用效果小於css,將一個或多個style的值綁定到DOM元素上,經常使用於單個或少數量style變動時使用。

九、attr:更改DOM元素的任何屬性值,關聯viewModel上對應的attr屬性值,便於動態更改展現。注意:在取屬性名稱時若是存在不合法的命名下,如data-something需轉換爲'data-something'。

針對該五個綁定元素,簡單演示一下功能:

Html:

 1 <div style="margin-top:50px;">
 2     <style type="text/css">
 3         .testClass {
 4             background-color: #ffd800;
 5             font-size: 16px;
 6         }
 7     </style>
 8     <label>公司類型:</label>
 9     <select data-bind="options:unitTypeOptions, optionsCaption:'---請選擇公司類型---',optionsText: 'text', optionsValue: 'value', value:choiceUnitTypeValue"></select><br />
10     <input type="checkbox" data-bind="checked:visibleLabel" /><label data-bind="css: { testClass: visibleLabel}">啓用展現</label>
11     <label data-bind="text:'選中值:'+choiceUnitTypeValue(),visible:visibleLabel"></label><br />
12     <a data-bind="attr: { title: tips},style:{'background-color':visibleLabel()?'red':'white'}">公司官網</a>
13     <button data-bind="click:function(){viewModel.tips('knockoutJS');}">切換a標籤提示信息</button>
14 </div>

JS代碼:

 1 <script type="text/javascript">
 2     var viewModel = {
 3         //value、text
 4         unitName: ko.observable(""),
 5         address: ko.observable(""),
 6 
 7         //click
 8         //viewModel內JS函數
 9         updateAddress: function () {
10             this.address("湖南長沙雨花區");
11         },
12 
13         //visible
14         visibleButton: ko.observable(true),
15 
16         //options
17         unitTypeOptions: ko.observableArray([
18             { text: "有限公司", value: "1" },
19             { text: "有限責任公司", value: "2" },
20             { text: "國有獨資公司", value: "3" },
21             { text: "股份有限公司", value: "4" }
22         ]),
23         choiceUnitTypeValue: ko.observable(),
24 
25         //checked
26         visibleLabel: ko.observable(true),
27 
28         //attr
29         tips: ko.observable("hello"),
30     };
31 
32     //任意JS函數
33     function updateUnitName() {
34         viewModel.unitName("中部星城科技");
35     }
36 
37     $(function () {
38         ko.applyBindings(viewModel);//完成綁定
39     });
40 </script>

動畫效果圖:

 

十、html:綁定到DOM元素上,並將viewModel的屬性值做爲展現,與text用法相同,但不一樣處在於,html能夠將內容中存在的html標記渲染爲真實的html內容。(我的建議少用或不用)

十一、event:爲DOM元素的事件添加指定的事件句柄,事件被觸發時執行咱們定義好的邏輯。經常使用在keypress、mouseover、mouseout事件上。與click用法同樣,能夠設置爲任意的js函數。

十二、submit:綁定在表單上用於提交時攔截默認表單提交動做,執行咱們定義好的邏輯,而後真正執行提交操做,該提交表單操做能夠是原有form表單提交,也能夠是咱們設計的表單提交,經過參數設置。僅用於form控件。

1三、enable:綁定DOM元素自身的啓用禁用狀態,關聯viewModel的屬性狀態,來控制該DOM元素的啓用。經常使用於input、select、textarea等控件中。

1四、disable:與enable功能相同,使用方式相反,當disable爲true時將被禁用。經常使用於input、select、textarea等控件中。

1五、selectedOptions:在multi-select列表中,選擇一個或多個項,並將選中的項加入到selectedOptions關聯的viewModel的屬性數組中。經常使用於多選項選擇。

針對該六個綁定元素,簡單演示一下功能:

Html:

 1 <div style="margin-top:50px;">
 2     <label>html元素所綁定的內容爲:</label>
 3     <label data-bind="html:htmlContent"></label><br />
 4     <div data-bind="event:{mouseover:buttonKeyPress}">
 5         鼠標移入改變html元素綁定內容
 6     </div>
 7     <hr />
 8     <form action="@Url.Action("CreateUser")" method="post" data-bind="submit:submitForm">
 9         <label>用戶名:</label>
10         <input type="text" name="userName" data-bind="enable:userNameEnable" />
11         <label>密碼:</label>
12         <input type="text" name="password" data-bind="disable:passwordDisable" />
13         <input type="submit" value="增長" />
14     </form><br />
15     <button data-bind="click:function(){viewModel.userNameEnable(true);}">啓用用戶名輸入</button>
16     <button style="margin-left:10px;" data-bind="click:function(){viewModel.passwordDisable(false);}">啓用密碼輸入</button><br />
17     <hr />
18     <p>
19         <select data-bind="options: companyOptions,selectedOptions: chosenCompanies" size="5" multiple="true"></select>
20         <select data-bind="options: chosenCompanies," size="5"></select>
21     </p>
22 </div>

JS代碼:

 1 <script type="text/javascript">
 2     var viewModel = {
 3           
 4         //html
 5         htmlContent: ko.observable("<a href='#'>百度一下</a>"),
 6 
 7         //event
 8         buttonKeyPress: function () {
 9             this.htmlContent("keyPress事件被觸發!");
10         },
11 
12         //submit
13         submitForm: function (formElement) {
14             //執行邏輯
15             //執行表單提交
16             //或返回到默認表單提交return true
17             return true;
18         },
19 
20         //enable
21         userNameEnable: ko.observable(false),
22 
23         //disable
24         passwordDisable: ko.observable(true),
25 
26         //selectedOptions
27         companyOptions: ko.observableArray(['百度', '阿里', '騰訊']),
28         chosenCompanies: ko.observableArray(['百度'])
29     };
30 
31     //任意JS函數
32     function updateUnitName() {
33         viewModel.unitName("中部星城科技");
34     }
35 
36     $(function () {
37         ko.applyBindings(viewModel);//完成綁定
38     });
39 </script>

動畫效果圖:

1六、uniqueName:綁定DOM元素有一個非空的name屬性,在沒有設置name屬性下,會綁定上一個而惟一的name屬性。(使用場景太少,我的尚未使用過)

 

0、foreach: 綁定到DOM元素上,將關聯的viewModel中指定集合或數組循環輸出,並動態更改html代碼。配合table、div等控件使用。(我的最喜歡的綁定元素,強大的存在)

Html:

 1 <table class="table table-bordered" style="margin-top:5px;">
 2     <thead>
 3         <tr>
 4             <th>公司名稱</th>
 5             <th>公司地址</th>
 6             <th></th>
 7         </tr>
 8     </thead>
 9     <tbody data-bind="foreach:unitList">
10         <tr>
11             <td><input type="text" data-bind="value:unitName" /></td>
12             <td><input type="text" data-bind="value:address" /></td>
13             <td><button class="btn btn-danger" data-bind="click:$root.removeUnitInfo">刪除</button></td>
14         </tr>
15     </tbody>
16     <tfoot>
17         <tr>
18             <td colspan="3">
19                 <button type="button" class="btn btn-primary" data-bind="click:addUnitInfo">增長</button>
20             </td>
21         </tr>
22     </tfoot>
23 </table>
24 <div>
25     <label>現有公司信息列表:</label>
26     <div data-bind="foreach:unitList">
27         <label data-bind="text:'公司名稱:'+unitName()+'.公司地址:'+address()+'.'"></label><br />
28     </div>
29 </div>

JS代碼:

 1 <script type="text/javascript">
 2     function unitViewModel(name, addressInfo) {
 3         unitName = ko.observable(name);
 4         address = ko.observable(addressInfo);
 5     }
 6 
 7     var viewModel = {
 8         unitList: ko.observableArray(),
 9 
10         addUnitInfo: function () {
11             viewModel.unitList.push(new unitViewModel("", ""));
12         },
13         removeUnitInfo: function (unit) {
14             viewModel.unitList.remove(unit);
15         },
16     };
17 
18     $(function () {
19         ko.applyBindings(viewModel);//完成綁定
20         viewModel.unitList.push(new unitViewModel("星城科技", "湖南-長沙"));
21         viewModel.unitList.push(new unitViewModel("星城集團", "湖南-長沙"));
22         viewModel.unitList.push(new unitViewModel("中車集團", "湖南-株洲"));
23     });
24 </script>

動畫效果圖:

 本次對於全部綁定元素進行了簡單的功能講解和操做,後期將會綜合運用這些完成一些功能。

 本文地址: http://www.javashuo.com/article/p-qgprptsa-ge.html

 本文demo地址:https://gitee.com/530521314/koInstance.git

 

2018-08-26,望技術有成後能回來看見本身的腳步
相關文章
相關標籤/搜索