標籤:style blog http color java 使用 io strong for
由於component binding部分的內容更為複雜一些,所以這部分我暫時跳過,先學習click binding部分。
click binding不僅可以作用於button、input、a等元素,也可以作用於其他任何可見的DOM元素。
下面是一個簡單的例子:
html部分:
1 <div>2 You‘ve clicked <span data-bind="text: numberOfClicks"></span> times3 <button data-bind="click: incrementClickCounter">Click me</button>4 </div>
js部分:
1 function MyViewModel() { 2 var self = this; 3 self.numberOfClicks = ko.observable(0); 4 self.incrementClickCounter = function() { 5 var previousCount = self.numberOfClicks(); 6 self.numberOfClicks(previousCount + 1); 7 }; 8 } 9 10 ko.applyBindings(new MyViewModel());
這裡需要注意的是numberOfClicks的修改方法。
click binding不僅僅可以綁定viewModel中的方法,也可以綁定其他任意的方法。
注意一:在調用click binding的處理函數時,我們可以給它傳遞一個參數作為當前作用的項(current item),這種操作往往在處理集合或是數組時非常有用。
下面是一個簡單的例子:
html部分:
1 <ul data-bind="foreach: people">2 <li>3 <span data-bind="text: $data"></span>4 <button data-bind="click: $parent.removePerson">Remove</button>5 </li>6 </ul>
js部分:
1 function MyViewModel() {2 var self = this;3 self.people = ko.observableArray([ "Kazusa", "Chiaki", "Charlie" ]);4 self.removePerson = function(person) {5 self.people.remove(person);6 };7 }8 9 ko.applyBindings(new MyViewModel());
注意上例中關於$parent的使用,在使用foreach binding或是with binding時,一定要明確自己能夠直接調用的viewModelProperty的範圍,如果在更高的層次,則要考慮使用$parent或是$root這樣的首碼。
注意二:在某些時候,我們需要擷取與click事件相關聯的DOM event object(說起來聽繞口,我覺得可以直接就說是包含click在內的能夠觸發相應綁定的處理函數的事件),KO將這個事件作為處理函數的第二個參數,比如說我們希望在按下shift鍵的clik與一般的click有所區別,則可以利用這一參數在處理函數中進行區分。
如果我們需要傳遞更多的參數,有以下兩種方式:
1 <button data-bind="click: function(data, event) { myFunction(‘param1‘, ‘param2‘, data, event) }">2 Click me3 </button>
1 <button data-bind="click: myFunction.bind($data, ‘param1‘, ‘param2‘)">2 Click me3 </button>
其中第二種方式用到了bind方法,可以參考function.prototype.bind(),這個留作以後研究。
注意三:在預設情況下,使用click binding會屏蔽掉原先click的預設功能,比如對於一個a元素,在使用click binding之後,並不會跳轉到href所描述的地址。如果我們希望恢複預設的功能,只需要在click binding所綁定的處理函數的最後返回一個true即可。
注意四:在某些時候,我們的html部分可能會存在嵌套的click binding的情況,如下:
1 <div data-bind="click: function1">2 <div data-bind="click: function2">3 <button data-bind="click: function3">Click me</button>4 </div>5 </div>
在這種情況下,如果我們點擊頁面上的button,則會依次觸發function3、function2、function1。為了防止這種現象,我們可以在data-bind後附加clickBubble:false來阻止click事件繼續向上傳遞,比如說我們將代碼改成這樣:
1 <div data-bind="click: function1">2 <div data-bind="click: function2">3 <button data-bind="click: function3, clickBubble: false">Click me</button>4 </div>5 </div>
這樣一來就只會觸發function3。而如果我們是在function2後面添加,則只會依次觸發function3和function2,以此類推。
KnockoutJs學習筆記(九)