Knockout2.x开发 第十三章:表单域Form fields:submit绑定、enable绑定
2013-05-02 17:37 阅读(179)

"submit" 绑定

"submit 绑定"在form表单上添加指定的事件以便该form被提交的时候执行定义的JavaScript 函数。只能用在表单 form 元素上。

当你使用 submit绑定的时候, Knockout会阻止form表单默认的submit动作。换句话说,浏览器会执行你定义的绑定函数而不会提交这个form表单到服务器上。可以很好地解释这个,使用 submit 绑定就是为了处理view model的自定义函数的,而不是再使用普通的HTML form表单。 如果你要继续执行默认的HTML form表单操作,你可以在你的 submit 句柄里返回 true 。


基本用法

Html代码
<form data-bind="submit: doSomething" action="save.jsp">
   ... 点击提交表单那内容 ...
   <button type="submit">提交</button>
</form>

Js代码

var viewModel = {
   doSomething : function(formElement) {
       //..do something
	   
       return true;//省略此句表单不会进行提交,一般适用于ajax处理。
   }
};
ko.applyBindings(viewModel);
当点击提交按钮时,表单不进行提交到save.jsp操作,只简单调用doSomething函数,除非在函数内显示返回true(return true)。另外,如果绑定函数带有参数,KO将把整个form表单元素作为参数传递到你的submit绑定函数里,如上面的参数formElement


为什么不在submit按钮上使用click绑定?


在form上,你可以使用 click 绑定代替 submit 绑定。不过 submit 可以处理其它的函数行为,比如在输入框里输入回车的时候可以提交表单。

Html代码

<form data-bind="submit: doSomething" action="save.jsp">
   ... 点击提交表单那内容 ...
   <input />
   <button type="submit">提交</button>
</form>
Js代码

var viewModel = {
   doSomething : function(formElement) {
       //..do something
	   alert("点击回车触发了submit");
   }
};
ko.applyBindings(viewModel);
在输入框内输入内容,然后按回车,也可触发submit



"enable" 绑定

我们的UI元素在很多时候可能不希望用户可以编辑,或者在达到某些条件的时候,开启/关闭DOM元素的编辑功能,这个时候,就该使用enable绑定

"enable 绑定"使DOM元素只有在参数值为 true的时候才启用。在form表单元素 input, select, 和textarea 上非常有用。

基本用法

Html代码

<p>
  <input type='checkbox' data-bind="checked: hasCellphone" />
  I have a cellphone
</p>
<p>
  Your cellphone number:<input type='text' data-bind="value: cellphoneNumber, enable: hasCellphone" />
</p>
Js代码

var viewModel = {
   hasCellphone : ko.observable(false),
   cellphoneNumber: ""
};
ko.applyBindings(viewModel);

这个例子里,“Your cellphone number”后的文本框初始情况下是禁用的,只有当用户点击上面的checkbox时候才可用。

使用任意JavaScript表达式

不紧紧限制于变量 – 你可以使用任何JavaScript表达式来控制元素是否可用。例如,

Html代码

<button data-bind="enable: cellphoneNumber() == '555'">
   Do something
</button>
Js代码

var viewModel = {
   cellphoneNumber: ko.observable("555")
};
ko.applyBindings(viewModel);
当属性cellphoneNumber的值等于'555',按钮button启用,不等于时禁用。