ko学习笔记

我们先来look一下ko实现原理mvvm模式,即模型-视图-视图模型。

mvvm一开始我觉得跟mvc模式的差不多,只是把controller换成viewmodel取代,换汤不换药,后来深入了解一下mvvm之后发现两者还是有区别的。比如以ko实现的mvvm模式而言,其核心是“绑定”即“数据的绑定”和“行为的绑定”。数据的绑定,就是将viewmodel定义的数据绑定到View中的html元素上,它支持双向和单向绑定,用户在界面上输入的数据可以被viewmodel捕获,而viewmodel对数据的更新可以自动反映在view,这样通过js定义ui处理逻辑的时候,就不需要需关注view(html元素)的细节,只需要对自身的数据进行操作即可。行为绑定就是事件注册,即view中html元素的事件(比如click事件)与viewmodel定义的方法进行绑定。如下图所示:

简单介绍一下ko,它是声明式绑定(data-bind)将DOM元素和模型数据(model data)关联在一起,UI界面会根据模型数据的改变自动更新,它可以在模型数据间建立隐式依赖关系链,它还能以模型数据函数为基础,快速生成复杂可嵌套的UI。它的优点是:

1双向绑定:view跟viewmodel可以相互更新数据。

2逻辑与UI分离:页面数据处理逻辑与html元素完全分离。

3维护简单:与其他js框架比只需要少量代码即可实现需求,维护量小。

下面简单列举一下ko使用的基本步骤:

1定义一个viewmodel

function ViewModel() {

var self=this;

    self.firstName = ko.observable("Bert");
self.lastName =ko.observable("Bertington");

self.test=function(){

self. firstName=”test”;

}

}

使用observable方法赋值,可以实现UI页面数据根据viewmodel改变自动更新,viewmodel也会根据UI改变更新model中的数据。当如果是要传递数组时可以使用observableArray方法。比如:

self.myobservableArray =ko. observableArray ([{ name:"Bungle",type:"Bear" },{ name:"George",type: "Hippo" },{name: "Zippy", type:"Unknown"}]);
如果需要动态添加项,则myObservableArray.push("Some Value"),myObservableArray. unshift("Some Value") ,两者不同点是第一个删除数组末尾元素,第二个删除数组开头元素。
动态删除项:myObservableArray.pop();myObservableArray.shift();第一个删除数组末尾元素,第二个删除数组开头元素。
翻转整个数组的顺序myObservableArray.reverse();
给数组排序  myObservableArray.sort();

2把这个viewmodel添加到ko中

ko.applyBindings(new ViewModel());
 
3在DOM元素中绑定
<span>First name: <strong data-bind="text:firstName"> </strong></span>
<span>Last name: <strong data-bind="text:lastName">> </strong></span>
data-bind里面绑定的可以是DOM元素的任何属性或者方法,绑定方法时不需要加括号,但是如果要对这个方法进行计算处理,那就需要加括号。比如
<span>First name: <strong data-bind="click: test"></strong></span>
<span>First name: <strong data-bind="click: test()+‘1‘"> </strong></span>
上面test方法实现的是两个observable字段值的计算,我们可以通过ko的computed属性实现,它是observable类型,但它是基于其他observable字段值计算得出的)
    self.fullName = ko.computed(function() {
        return self.firstName() + " " + self.lastName();    
}, self);
 
4使用模板实现循环计算
<div data-bind="template: { name: ‘test-template‘, data: first }"></div>
<div data-bind="template: { name: ‘ test-template‘, data: last }"></div>
 <script type="text/html" id=" test-template">
    <h3 data-bind="text: name"></h3>
 <p>Credits: <span data-bind="text: credits"></span></p>
</script>
 
<script type="text/javascript">
      function ViewModel() {
            Var self=this;
         self. first = { name: ‘Franklin‘, credits: 99 };
         self. last = { name: ‘Mario‘, credits: 50 };
      }
      ko.applyBindings(new ViewModel());
17 </script>
关键在于script中的id要与data-bind中的name对应。
还有一种方式实现循环
function ViewModel() {
        var self=this;
        this.people = [
          { name: ‘Franklin‘, credits: 95 },
          { name: ‘Mario‘, credits: 50 }
      ]
  }
  ko.applyBindings(new ViewModel());
 
 <div data-bind="foreach: people">
     <h3 data-bind="text: name"></h3>
     <p>Credits: <span data-bind="text: credits"></span></p>
 </div>

当然还有很多其他的ko方法与属性,可以参考http://knockoutjs.com/downloads/index.html学习
时间: 2024-12-29 04:53:09

ko学习笔记的相关文章

Knockout学习笔记(三)

之前的文章主要针对的是单一的observable(即便是observableArray也是一种observable),而文档Using computed observables则主要是针对ko.computed这一function,它能够将多个observable联系起来,无论这些observable中的哪个发生了变化,ko.computed也会发生相应的变化并将结果反应在UI中. 首先,创建一个view model如下: 1 function MyViewModel() { 2 this.fi

SystemTap 学习笔记 - 安装篇

https://segmentfault.com/a/1190000000671438 在安装前,需要知道下自己的系统环境,我的环境如下: uname -r 2.6.18-308.el5 Linux 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux 安装 为了部署 SystemTap,需要安装以下两个 RPM 包: systemtap systemtap-runtime 以 root

Knockout学习笔记(二)

这篇文章主要用于记录学习Working with observable arrays的测试和体会. Observable主要用于单一个体的修改订阅,当我们在处理一堆个体时,当UI需要重复显示一些样式相同的元素时,这些数据的绑定就需要依靠observable arrays. 特别需要注意的一点是,observable arrays关注的是数组中元素整体的变化(包括增加元素,删减元素,元素顺序的改变等等),而不是元素个体的变化(元素内部某些部分的改变). 我们可以在js文件中创建一个observab

内核编译安装学习笔记

前提:查看本地硬件信息常用工具 查看CPU信息: #cat /proc/cpuinfo #x86info #lscpu 查看PCI: #lspci 查看USB: #lsusb 查看块设备: #lsblk 查看综合的设备详细信息: #hal-device 编译:交叉编译 cross-compiling用于在宿主机上编译,应用于别的机器上架构迥异的内核. 编译内核的步骤:(安装好开发环境:Development Tools,Server Platform Development,ncurses-de

嵌入式Linux学习笔记之LED驱动

最近在学习嵌入式Linux驱动开发,大致了解了驱动的基本开发流程,本文主要针对字符设备驱动开发做一个简要介绍,也当作是对这几天工作的一个小小总结. 计算机系统是由软硬件相互协调共同完成工作的,作为专用计算机系统的嵌入式系统也不例外,既要有CPU.SDRAM.FLASH.IO等硬件,同时也少不了操作系统和应用软件等软件的支持,而作为应用程序与硬件的桥梁--驱动程序,是整个嵌入式系统开发过程中的关键环节.驱动开发涉及底层,而了解底层作用机制对于整个系统的开发意义重大. Linux内核中有60%以上是

linux系统驱动基础学习笔记

Linux驱动: 角色:应用程序 API      操作系统      驱动       实际硬件 功能:1.对设备进行初始化和释放2.把数据从内核传送到硬件和从硬件读取数据3.检测和处理设备出现的错误 Linux驱动程序类型:字符设备:由文件系统管理    (通过设备文件访问)块设备:由文件系统管理网络设备:由协议栈管理      (通过socket访问) 查看系统设备文件ls -l /devcat /proc/devicescat /sys/power/state 属性:文件类型   主设备

Knockout学习笔记(四)

由于Writable computed observables和How dependency tracking works的要求相对较高,我先跳过这两篇,学习Pure computed observables. Pure computed observables相对于一般的computed observables,在性能和存储上有优势,这是因为pure computed observables在不存在订阅者的时候是不会保持订阅关系的.这也使得pure computed observables有如

Android深度探索(卷1)HAL与驱动开发学习笔记(6)

Android深度探索(卷1)HAL与驱动开发学习笔记(6) 第六章 第一个Linux驱动程序 统计单词个数   Linux系统将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这种设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.虽然C语言里没有事件的概念,但却有与事件类似的概念,这就是回调(c a l l b a c k)函数.因此,编写Lin u x驱动最重要的一步就是编写阴调函数,否则与设备文件交互的数据将无法得到处理. 6.1编写L

linux 驱动学习笔记01--Linux 内核的编译

由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make config(基于文本的最为传统的配置界面,不推荐使用)#make menuconfig(基于文本菜单的配置界面)#make xconfig(要求 QT 被安装)#make gconfig(要求 GTK+被安装)在配置 Linux 2.6 内核所使用的 make config. make menuconfig. mak