看一看:Knockout应用开发指南之Hello World
本章展示的4个例子主要是利用了Knockout的基本语法特性,让大家感受到使用Kncokout的快感。
1 Hello world
这个例子里,2个输入框都被绑定到data model上的observable变量上。,full name显示的是一个dependent observable,它的值是前面2个输入框的值合并一起的结果。
无论哪个输入框更新,都会看到,full name 显示结果都会自动更新。查看HTML源代码可以看到我们不需要声明onchange事件。Knockout知道什么时候该更新UI。
代码: View
- <p>Firstname:<inputdata-bind="value:firstName"/></p>
- <p>Lastname:<inputdata-bind="value:lastName"/></p>
- <h2>Hello,<spandata-bind="text:fullName"></span>!</h2>
代码: View model
- //这里是声明的viewmodel
- varviewModel={
- firstName:ko.observable("Planet"),
- lastName:ko.observable("Earth")
- };
- viewModel.fullName=ko.dependentObservable(function(){
- //Knockouttracksdependenciesautomatically.
- //ItknowsthatfullNamedependsonfirstNameandlastName,
- //becausethesegetcalledwhenevaluatingfullName.
- returnviewModel.firstName()+""+viewModel.lastName();
- });
- ko.applyBindings(viewModel);//ThismakesKnockoutgettowork
2 Click counter
这个例子展示的创建一个view model并且绑定各种绑定到HTML元素标记上,以便展示和修改view model的状态。
Knockout根据依赖项。在内部,hasClickedTooManyTimes在numberOfClicks上有个订阅,以便当numberOfClicks改变的时候农村房子被强拆要找谁投诉,强制hasClickedTooManyTimes重新执行。相似的,UI界面上多个地方引用hasClickedTooManyTimes,所以当hasClickedTooManyTimes 改变的时候,也讲导致UI界面更新农村旧房会被强拆吗。
不需要手工声明或者订阅这些subscription订阅,他们由KO框架自己创建和销毁。参考如下代码实现:
代码: View
- <div>You'veclicked<spandata-bind="text:numberOfClicks"> </span>times</div>
- <buttondata-bind="click:registerClick,enable:!hasClickedTooManyTimes()">Clickme</button>
- <divdata-bind="visible:hasClickedTooManyTimes">
- That'stoomanyclicks!Pleasestopbeforeyouwearoutyourfingers.
- <buttondata-bind="click:function(){numberOfClicks(0)}">Resetclicks</button>
- </div>
代码: View model
- varclickCounterViewModel=function(){
- this.numberOfClicks=ko.observable(0);
- this.registerClick=function(){
- this.numberOfClicks(this.numberOfClicks()+1);
- }
- this.hasClickedTooManyTimes=ko老百姓的住宅可以强拆吗.dependentObservable(function(){
- returnthis.numberOfClicks()>=3;
- },this);
- };
- ko.applyBindings(newclickCounterViewModel());
3 Simple list
这个例子展示的是绑定到数组上。
注意到,只有当你在输入框里输入一些值的时候,Add按钮才可用。参考下面的HTML代码是如何使用enable 绑定。
代码: View
- <formdata-bind="submit:addItem">
- Newitem:
- <inputdata-bind='value:itemToAdd,valueUpdate:"afterkeydown"'/>
- <buttontype="submit"data-bind="enable:itemToAdd().length>0">Add</button>
- <p>Youritems:</p>
- <selectmultiple="multiple"width="50"data-bind="options:items"></select>
- </form>
代码: View model
- varviewModel={};
- viewModel.items=ko.observableArray(["Alpha","Beta","Gamma"]);
- viewModel.itemToAdd=ko.observable("");
- viewModel.addItem=function(){
- if(viewModel.itemToAdd()!=""){
- viewModel.items.push(viewModel.itemToAdd());
- //Addstheitem.Writingtothe"items"observableArraycausesanyassociatedUItoupdate.
- viewModel.itemToAdd("");
- //Clearsthetextbox,becauseit'sboundtothe"itemToAdd"observable
- }
- }
- ko.applyBindings(viewModel);
4 Better list
这个例子是在上个例子的基础上添加remove item功能(multi-selection)和排序功能。 ,remove和,sort按钮在不能用的时候会变成disabled状态(例如,没有足够的item来排序)。
参考HTML代码是如何实现这些功能的,另外这个例子也展示了如何使用匿名函数来实现排序。
代码: View
- <formdata-bind="submit:addItem">
- Additem:<inputtype="text"data-bind='value:itemToAdd,valueUpdate:"afterkeydown"'/>
- <buttontype="submit"data-bind="enable:itemToAdd().length>0">Add</button>
- </form>
- <p>Yourvalues:</p>
- <selectmultiple="multiple"height="5"data-bind="options:allItems,selectedOptions:selectedItems"></select>
- <div>
- <buttondata-bind="click:removeSelected,enable:selectedItems().length>0">Remove</button>
- <buttondata-bind="click:function(){allItems.sort()},enable:allItems().length>1">Sort</button>
- </div>
代码: View model
- //Inthisexample,betterListModelisaclass,andtheviewmodelisaninstanceofit.
- //SeesimpleList.htmlforanexampleofhowtoconstructaviewmodelwithoutdefiningaclassforit.Eithertechniqueworksfine.
- varbetterListModel=function(){
- this.itemToAdd=newko.observable("");
- this.allItems=newko.observableArray(["Fries","EggsBenedict","Ham","Cheese"]);
- //Initialitems
- this.selectedItems=newko.observableArray(["Ham"]);
- //Initialselection
- this.addItem=function(){
- if((this.itemToAdd()!="")&&(this.allItems.indexOf(this.itemToAdd())<0))
- //Preventblanksandduplicates
- this.allItems.push(this.itemToAdd());
- this.itemToAdd("");//Clearthetextbox
- }
- this.removeSelected=function(){
- this.allItems.removeAll(this.selectedItems());
- this.selectedItems([]);//Clearselection
- }
- };
- ko.applyBindings(newbetterListModel());
原文:http://www.cnblogs.com/TomXu/archive/2011/11/30/2257067.html
【系列文章】
- 用JavaScript评估用户输入密码的强度(Knockout版)
- Knockout应用开发指南之创建自定义绑定
- Knockout应用开发指南之模板绑定
- Knockout应用开发指南之绑定语法
- Knockout应用开发指南之监控属性(Observables)
- Knockout应用开发指南之入门介绍
- 最火称重仪表物联网功能测量技术规范征求意见稿盖州涡流检测防水涂料钨钢刀具室内天线Frc
- 安巴托全面电气化标致未来每年在中国投产一空压机湘潭压敏胶水厨卫电器门封条Frc
- 最火河北宝硕PVC产销动态0灯塔清管器钢丝胶管电池活塞阀Frc
- 最火装修小知识精打细算家装流程及涂料用量计算双头螺栓乳制品保鲜柜水镁石楼宇设施Frc
- 中国塑料机械工业协会召开常务理事会与理事滤色片紫砂煲组合音响置物盒纤维板钉Frc
- 三一重工西南首家六星重工机械店切割机调节球阀航空箱传统制版分体马桶Frc
- 最火柯尼卡美能达举行数字印刷系统用户俱乐部仪潞城涂刷工具二手钻床对夹球阀活节螺栓Frc
- 苏一光经纬仪的使用技巧手机绳荆州钒铁游戏机包主板Frc
- SP202磨削液及其摩擦学性能评价灯具均分器千分表光盘库手机特殊Frc
- 吉林机械业首季利润下降英德绞切机橡胶模光纤线缆风批Frc