Knockout2.x开发 第十二章:表单域Form fields:Event绑定
2013-04-30 17:34 阅读(192)

"event" 绑定

"event 绑定"在DOM元素上添加指定的事件以便元素被触发的时候执行定义的JavaScript 函数。大部分情况下是用在 keypressmouseover 和 mouseout上。


基本用法

Html代码

<div>
    <div data-bind="event: { mouseover: enableDetails, mouseout: disableDetails }">
        Mouse over me
    </div>
    <div data-bind="visible: detailsEnabled">
        Details
    </div>
 </div>
Js代码

var viewModel = {
        detailsEnabled: ko.observable(false),
        enableDetails: function() {
            this.detailsEnabled(true);
        },
        disableDetails: function() {
            this.detailsEnabled(false);
        }
    };
ko.applyBindings(viewModel);
演示了鼠标的移入(mouseover)、移出(mouseout)事件。


以下用法同click绑定用法相同,所以就不在描述,只给出例子。


Demo1:演示传递"当前项目"作为处理函数的一个参数

Html代码

<ul data-bind="foreach: places">
     <li data-bind="text: $data, event: { mouseover: $parent.logMouseOver }"> </li>
</ul>
<p>You seem to be interested in: <span data-bind="text: lastInterest"> </span></p>
Js代码

function MyViewModel() {
    var self = this;
	self.lastInterest = ko.observable();
	self.places = ko.observableArray(['London', 'Paris', 'Tokyo']);
	self.logMouseOver = function(place) {
	   self.lastInterest(place);
	}
}
ko.applyBindings(new MyViewModel());

Demo2:演示获取当前DOM的event对象

Html代码

<div data-bind="event: { mouseover: myFunction }">Mouse over me</div>
Js代码

var viewModel = {
   myFunction: function(data, event) {
      if (event.shiftKey) {
	     alert("您按了shift键");
      } else {
	     alert("您没有按shift键");
      }
   }
};
ko.applyBindings(viewModel);

Demo3:演示添加自定义参数

Html代码

<div data-bind="event: { mouseover: function(data, event) { myFunction(data, event, '我的参数1', '我的参数2') } }">
    Mouse over me
</div>
Js代码

var viewModel = {
   myFunction: function(data, event,para1,para2) {

        alert('data=' + data);
        alert('event=' + event);
        alert('para1='+para1);
        alert('para2='+para2);    
   }
};
ko.applyBindings(viewModel);

Demo4:演示允许执行默认事件

默认情况下,Knockout会阻止冒泡,防止默认的事件继续执行。例如,使用 event 语法在 input 标签上绑定一个 keypress 事件,当你输入内容的时候,浏览器只会调用你的函数而不是 添加 input 的值。 另外一个例子 "click" 绑定,在执行完自定义事件时它不会连接到 href地址。因为你的click 绑定主要就是操作你的view model,而不是连接到另外一个页面。当然,如果你想让默认的事件继续执行,你可以在你 event 的自定义函数里返回 true 。

Html代码

<input data-bind="event: { keypress : myFunction }"/>
Js代码
var viewModel = {
        myFunction: function() {
            return true;//添加return true语句,否则默认无法在文本框输入内容
        }
    };
ko.applyBindings(viewModel);

Demo5:演示防止事件冒泡

默认情况下,Knockout允许event事件继续在更高一层的事件句柄上冒泡执行。例如,如果你的元素和父元素都绑定了 mouseover 事件,那么如果你的鼠标在该元素移动的时候两个事件都会触发的。如果需要,你可以通过额外的绑定 youreventBubble 来禁止冒泡。例如:

Html代码

<div data-bind="event: { mouseover: myDivHandler }">
   <button data-bind="event: { mouseover: myButtonHandler }, mouseoverBubble: false">
      Mouse over me
   </button>
</div>
Js代码

var MyViewModel = {
    myDivHandler: function() {
	    alert("myDivHandler");
    },
    myButtonHandler: function() {
	    alert("myButtonHandler");
    }
};

ko.applyBindings(MyViewModel);