Knockout學習之表單綁定器(下)


“hasFocus”綁定

hasFocus綁定器會將DOM元素的焦點狀態與視圖模型中的屬性相關聯,當你設置視圖模型中關聯的屬性為true或false后,將能夠設置關鍵的DOM元素是否獲得焦點。

 

比如下面的例子將會演示如何使用通過代碼設置焦點,並且當關聯的標簽獲得焦點后顯示一段文本:

 1 <div>
 2     <input type="text" data-bind="hasfocus: focusState" />
 3     <button type="button" data-bind="click:setFocus" >set focus</button>
 4     <span data-bind="visible:focusState" >the text box has focus</span>
 5 </div>
 6 
 7 
 8     <script type="text/javascript">
 9 
10         var appViewModel = function () {
11             var self = this;
12             this.focusState = ko.observable(false);
13             this.setFocus = function () {
14                 self.focusState(true);
15             };
16         }
17 
18         ko.applyBindings(new appViewModel());
19     </script>

 

“checked”綁定

“checked”綁定器用來關聯checkable表單控件,比如復選框和單選框。

 

比如下面的列子可以判斷用戶是否勾選了這個復選框:

 1 <div>
 2     <input type="checkbox" data-bind="checked: isChecked" />
 3 </div>
 4 <div>
 5     <button type="button" data-bind="click:setFocus">勾選</button>
 6 </div>
 7 
 8 
 9     <script type="text/javascript">
10 
11         var appViewModel = function () {
12             var self = this;
13             this.isChecked = ko.observable(false);
14             this.setFocus = function () {
15                 self.isChecked(true);
16             };
17         }
18 
19         ko.applyBindings(new appViewModel());
20     </script>

 

 

再復雜些就是可以將用戶勾選的值組成數組,比如下面的例子:

 1 <div>
 2     <input type="checkbox" value="a" data-bind="checked: CheckArray" />
 3     <input type="checkbox" value="b" data-bind="checked:CheckArray" />
 4     <input type="checkbox" value="c" data-bind="checked:CheckArray" />
 5 </div>
 6 <div>
 7     <button type="button" data-bind="click:showChecked">show checked</button>
 8 </div>
 9 
10 
11     <script type="text/javascript">
12 
13         var appViewModel = function () {
14             var self = this;
15             this.CheckArray = ko.observableArray(['a','b']);
16             this.showChecked = function () {
17                 alert(self.CheckArray().toString());
18             };
19         }
20 
21         ko.applyBindings(new appViewModel());
22     </script>

 

 

當然不僅僅只有復選,在單選的情況下只會將選擇的元素的value值更新到視圖模型中去,比如下面的例子所示:

 1 <div>
 2     <input type="radio" name="1" value="a" data-bind="checked: CheckEle" />
 3     <input type="radio" name="1" value="b" data-bind="checked: CheckEle" />
 4     <input type="radio" name="1" value="c" data-bind="checked: CheckEle" />
 5 </div>
 6 <div>
 7     <button type="button" data-bind="click:showChecked">show checked</button>
 8 </div>
 9 
10 
11     <script type="text/javascript">
12 
13         var appViewModel = function () {
14             var self = this;
15             this.CheckEle = ko.observable('a');
16             this.showChecked = function () {
17                 alert(self.CheckEle());
18             };
19         }
20 
21         ko.applyBindings(new appViewModel());
22     </script>

 

 

如果你不想用value那個值,可以加上checkedValue屬性,這樣更新到視圖模型中的值就是checkedValue指定的值。比如下面這樣:

1 <div>
2     <input type="radio" name="1" value="a" data-bind="checkedValue:'s', checked: CheckEle" />
3     <input type="radio" name="1" value="b" data-bind="checkedValue: 'd', checked: CheckEle" />
4     <input type="radio" name="1" value="c" data-bind="checkedValue: 'e', checked: CheckEle" />
5 </div>
6 <div>
7     <button type="button" data-bind="click:showChecked">show checked</button>
8 </div>

 

 

“options”綁定

“options”綁定器控制在下拉列表中顯示的項,比如<select>單選或者<select size=’6’ >多選,但是該綁定器不能在除了<select>標簽使用。

指定關聯的值必須是一個數組或者監控數組,ko會將這些數組中的項作為<select>的option顯示。

 

比如下面的例子,會將數組中的值全部顯示,同時我們還可以在此之后增加新的值到數組中,ko一樣會更新:

 1 <div>
 2     <select data-bind="options:dropOptions" ></select>
 3 </div>
 4 <div>
 5     <input type="text" data-bind="value:newOption" />
 6     <button type="button" data-bind="click: addNewOptions">add new item</button>
 7 </div>
 8 
 9 
10     <script type="text/javascript">
11 
12         var appViewModel = function () {
13             var self = this;
14             this.dropOptions = ko.observableArray(['a', 'b', 'c', 'd']);
15             this.newOption = ko.observable();
16             this.addNewOptions = function () {
17                 self.dropOptions.push(self.newOption());
18                 self.newOption('');
19             }
20         }
21 
22         ko.applyBindings(new appViewModel());
23     </script>

 

 

當然對於多選也一樣可以應付:

1 <div>
2     <select size="3" multiple="multiple" data-bind="options:dropOptions" ></select>
3 </div>

 

 

當然一定會有人問如何獲取選擇的項,這里我們可以用value綁定器,比如下面的代碼將第一個例子改寫,能夠顯示選擇的值:

 1 <div>
 2     <select data-bind="options:dropOptions,value:selectedOption" ></select>
 3 </div>
 4 <div>
 5     <input type="text" data-bind="value:newOption" />
 6     <button type="button" data-bind="click: addNewOptions">add new item</button>
 7     <button type="button" data-bind="click: showSelectOption">show selected value</button>
 8 </div>
 9 
10 
11     <script type="text/javascript">
12 
13         var appViewModel = function () {
14             var self = this;
15             this.dropOptions = ko.observableArray(['a', 'b', 'c', 'd']);
16             this.newOption = ko.observable();
17             this.selectedOption = ko.observable();
18             this.addNewOptions = function () {
19                 self.dropOptions.push(self.newOption());
20                 self.newOption('');
21             },
22             this.showSelectOption = function () {
23                 alert(self.selectedOption());
24             }
25         }
26 
27         ko.applyBindings(new appViewModel());
28     </script>

 

 

如果是多選我們可以將value關聯的屬性改成監控數組,那么就可以解決這個問題了,但是上面僅僅只是簡單的數組,實際的開發過程中可能是一個對象組成的數組,而我們也要將其顯示到下拉中,當然options綁定一樣可以辦到,比如下面的例子:

 1 <div>
 2     <select data-bind="options:dropOptions,value:selectedOption,optionsCaption:'choose...',optionsText:'text',optionsValue:'value'" ></select>
 3 </div>
 4 <div>
 5     <button type="button" data-bind="click: showSelectOption">show selected value</button>
 6 </div>
 7 
 8 
 9     <script type="text/javascript">
10         var ObjectArray = function (text, value) {
11             this.text = text;
12             this.value = value;
13         }
14 
15         var appViewModel = function () {
16             var self = this;
17             this.dropOptions = ko.observableArray([new ObjectArray('a', 1), new ObjectArray('b', 2), new ObjectArray('c', 1)]);
18             this.selectedOption = ko.observable();
19             this.showSelectOption = function () {
20                 alert(self.selectedOption());
21             }
22         }
23 
24         ko.applyBindings(new appViewModel());
25     </script>

 

 

這里我們通過optionsCaption是用來顯示提示的,optionsText是用來指定用於作為下拉顯示的屬性名稱,這里我們指定的是text,而optionsValue則是指定用於作為value的屬性名稱,我們指定的是value,那么當我們選擇一項之后,點擊顯示,則顯示的是value的值而不是text的值,當然optionsText也可以傳給它一個函數,那么ko會將數組中的當前項作為第一個參數傳遞給這個函數,當然這個函數也要返回用於顯示的文字。

 

還有一些其他參數如下:

optionsIncludeDestroyed:是否顯示數組中已經會設置為刪除標記的項,默認是不顯示的。

optionsAfterRender:當一個項顯示之后調用該函數,可以同來執行一些自定義的方法。

selectedOptions:用於多選的情況,用來關聯選擇的項。關聯到視圖模型中的屬性類型需要為數組,並且在通過push和pop操作該數組的同時,下拉中選擇的項也會跟着變動。

valueAllowUnset:當你指定的value不存在於下拉項中的時候,下拉將顯示空白,如果未設置該屬性為true則會將value關聯的屬性設置為undefined,同時下拉會顯示optionCaption指定的字符串。

 

“uniqueName”綁定

這個綁定器很簡單,就是用來給name屬性生成一個標識符。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM