Knockout学习之组合监控属性
2014-06-04 09:16 y-z-f 阅读(1510) 评论(0) 编辑 收藏 举报组合监控属性
顾名思义,就是我们可以将多个属性合并为一个属性。这样在显示的时候就是整体了,并且其中任何一个属性发生改变,这个属性也都会随之发生改变从而更新视图,而这些只需要使用computed函数就可以实现,比如下面的代码我们将firstName和lastName合并为fullName属性,并呈现:
1 <span data-bind="text: fullName" /> 2 3 <script type="text/javascript"> 4 function AppViewModel() { 5 this.firstName = ko.observable("Bob"); 6 this.lastName = ko.observable("Smith"); 7 this.fullName = ko.computed(function () { 8 return this.firstName() + " " + this.lastName(); 9 }, this); 10 }; 11 12 ko.applyBindings(new AppViewModel()); 13 </script>
这里我们通过传递一个函数给computed,并且该函数仅仅返回由firstName和lastName组成的完整姓名,这样我们就轻松的将两个属性组合了。其中computed的第二个参数传递的是this,主要是用来指定第一个参数的环境上下文。
上面仅仅只能用于显示,如果我们还要修改这个组合属性,那么就需要将上面的写法给写成如下的方式:
1 <span data-bind="text: firstName"></span> 2 <span data-bind="text: lastName"></span> 3 <input type="text" data-bind="value: fullName" /> 4 5 <script type="text/javascript"> 6 function AppViewModel() { 7 this.firstName = ko.observable("Bob"); 8 this.lastName = ko.observable("Smith"); 9 this.fullName = ko.computed({ 10 read: function () { 11 return this.firstName() + " " + this.lastName(); 12 }, 13 write: function (value) { 14 var lastSpecPos = value.lastIndexOf(" "); 15 if (lastSpecPos > 0) { 16 this.firstName(value.substring(0, lastSpecPos)); 17 this.lastName(value.substring(lastSpecPos + 1)); 18 } 19 }, 20 owner: this 21 }); 22 }; 23 24 ko.applyBindings(new AppViewModel()); 25 </script>
我们将传递给computed的参数改成了一个对象,并且写了read、write、owner属性,其中read用来读取该组合属性,而write用来赋值,所以该函数会有一个value参数,最后的owner跟computed的第二个参数是一样的,主要用来指定read和write函数执行的上下文环境。读者这个时候可以随意的修改文本中的值,会发现前面的值也会跟着变动,这些都是ko带给我们的快捷。
1 <span data-bind="text: firstName"></span> 2 <span data-bind="text: lastName"></span> 3 <input type="text" data-bind="value: fullName" /> 4 <span data-bind="visible:isEdit">你改动过了</span> 5 6 <script type="text/javascript"> 7 function AppViewModel() { 8 this.firstName = ko.observable("Bob"); 9 this.lastName = ko.observable("Smith"); 10 this.isEdit = ko.observable(false); 11 this.fullName = ko.computed({ 12 read: function () { 13 return this.firstName() + " " + this.lastName(); 14 }, 15 write: function (value) { 16 var lastSpecPos = value.lastIndexOf(" "); 17 if (lastSpecPos > 0) { 18 this.firstName(value.substring(0, lastSpecPos)); 19 this.lastName(value.substring(lastSpecPos + 1)); 20 this.isEdit(true); 21 } 22 }, 23 owner: this 24 }); 25 }; 26 27 ko.applyBindings(new AppViewModel()); 28 </script>
当然组合属性也不一定非要由多个属性组合,我们也可以将多个属性作为参数,然后通过ajax传递到服务端,从而获取属性值然后显示,比如jquery中的$.getJSON方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?