KnockOut綁定之Click綁定


       Click綁定對DOM元素添加一個函數,當DOM元素被點擊的時候調用。在button,input 或者a標簽中常用,但其實他適用於任何可見的DOM元素。

   example(click綁定)

@{
    Layout = null;
}
<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/knockout-3.2.0.js"></script>
<div>
    You've clicked <span data-bind="text: numberOfClicks"></span> times
    <button data-bind="click: incrementClickCounter">Click me</button>
</div>

<script type="text/javascript">
    var viewModel = {
        numberOfClicks: ko.observable(0),
        incrementClickCounter: function () {
            var previousCount = this.numberOfClicks();
            this.numberOfClicks(previousCount + 1);
        }
    };
    ko.applyBindings(viewModel);
</script>
View Code

       每當你點擊button按鈕的時候,viewModel 里面的incrementClickCounter() 函數被調用,然后更新 numberOfClicks 的值,然后更新界面

       我們可以調用任何javaScript函數,可以不在view model里面,也可以以someObject.someFunction的形式調用函數。

       example(傳遞本身綁定值作為參數)

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/knockout-3.2.0.js"></script>

<ul data-bind="foreach: places">
    <li>
        <!--foreach里面上下文是每一個place,可以用$data來表示當前項的值-->
        <span data-bind="text: $data"></span>
        <!--這兒也在foreach里面,所以click綁定對應的上下文也是$data,然后用$parent來調用其父項目,也就是viewModel,然后調用里面的removePlace函數-->
        <button data-bind="click: $parent.removePlace">Remove</button>
    </li>
</ul>

<script type="text/javascript">
    function MyViewModel() {
        var self = this;
        self.places = ko.observableArray(['London', 'Paris', 'Tokyo']);
        //當前項的值會被傳遞過來作為第一個參數,所以我們知道數組里面的哪一項被移除
        self.removePlace = function (place) {
            self.places.remove(place)
        }
    }
    ko.applyBindings(new MyViewModel());
</script>
View Code

      在這個例子中有兩點要注意:

  • 如果是在一個嵌套的綁定上下文,例如在一個foreach綁定,或者with塊綁定,但是你要調用viewmodel下面的函數,這時候你需要一個調用當前節點的父節點,或者直接調用根節點去訪問需要調用的函數,語法父節點用$parent,根節點用$root;
  • viewmodel里面用把this用一個self變量表示,相當於this的別名,防止在一些情況下引起的作用域鏈混亂;

     example(把事件傳遞給click調用的函數)

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/knockout-3.2.0.js"></script>
<button data-bind="click: myFunction">點擊</button>
<script type="text/javascript">
    var viewModel = {
        //這兒的data,就是上個例子中我們傳遞過去綁定上下文的值
        myFunction: function (data, event) {
            if (event.shiftKey) {
                //這兒對於click事件來說一般用不到,因為已經確定是click 事件了。
                alert("shift");
            } else {
                //執行點擊時操作
                alert("normal");
            }
        }
    };
    ko.applyBindings(viewModel);
</script>
View Code

     這個例子展示了給把事件句柄傳遞給函數,其中data指的是綁定上下文的值,其實也是指上個例子中的place

     example(傳遞任意參數給調用函數)

       如果你想傳任意的參數給調用函數,你可以用一個函數字面量來作為一個參數,意思就是說,click后面你可以傳遞任何javascript變量,因為javascript語法的特殊形式,一個函數也能作為變量傳遞,所以可以直接在click后面寫一個匿名函數,然后在該函數里面直接調用你想到調用的函數,同時把參數傳遞過去。

       

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/knockout-3.2.0.js"></script>
<button data-bind="click: myFunction">點擊</button>
<button data-bind="click: function(data, event) { myFunction('param1', 'param2', data, event) }">
    Click me
</button>
<script type="text/javascript">
    var viewModel = {
        myFunction: function (parameter1, parameter2, parameter3, parameter4) {
        }
    };
    ko.applyBindings(viewModel);
</script>
View Code

     除了用函數字面量的這種辦法,我們還可以用另一種辦法,用knockout的綁定函數,語法為函數名.bing(里面可以傳遞參數);

<button data-bind="click: myFunction.bind($data, 'param1', 'param2')">
    Click me
</button>
View Code

     阻止DOM元素的默認事件

      默認情況下,當你對一個DOM元素綁定一個click事件后,當你點擊的時候,他只會執行你的click事件,不會執行該DOM元素的默認事件。例如a標簽,當你給他綁定了一個事件后,點擊,執行綁定事件,但是他不會跳轉該a標簽指向的連接,如果你想讓它繼續執行,可以返回一個true;

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/knockout-3.2.0.js"></script>

<a href="http://www.cnblogs.com/santian/" data-bind="click: myFunction.bind($data, 'param1', 'param2')">
    Click me
</a>
<script type="text/javascript">
    var viewModel = {
        myFunction: function (parameter1, parameter2, parameter3, parameter4) {
            alert(1);
            //這兒如果你不return true,就不會跳轉
            //return true;
        }
    };
    ko.applyBindings(viewModel);
</script>
View Code

    阻止事件冒泡

     阻止事件冒泡,用如下語法

<div data-bind="click: myDivHandler">
    <button data-bind="click: myButtonHandler, clickBubble: false">
        Click me
    </button>
</div>
View Code

作者:一天兩天三天

本文地址:http://www.cnblogs.com/santian/p/4348532.html

博客地址:http://www.cnblogs.com/santian/

轉載請以超鏈接形式標明文章原始出處。

 


免責聲明!

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



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