代码改变世界

Knockout学习之监控属性

2014-06-03 14:01  y-z-f  阅读(4413)  评论(0编辑  收藏  举报

监控属性

Knockout包含以下三个核心特性:

1.监控属性和依赖跟踪

2.显式绑定

3.模板

 

下面我们将学习这三点中的第一点,在这之前我们先研究下MVVM模式和视图模型的概念。

 

MVVM和视图模型

模型:用来存储应用中的数据。它处于业务领域中,并且包含了相关的属性以及操作,与用户界面独立。在使用OK时,你将经常使用ajax保持该模型与服务端同步。

视图模型:使用纯代码表示界面的数据和操作。比如,你要实现一个列表编辑功能,那么你的视图模型就需要维持一组数据项,同时还要提供添加和删除方法。

视图:能够通过可视和可交互的方式呈现视图模型。它可以显示来自视图模型中的数据,也能将用户操作的命令传递给视图模型。

 

当你使用了KO,你的视图只需要由简单的html文档和显式绑定就可以轻松的连接到视图模型,或者你还可以使用模板配合视图模型中的数据生成html代码。

 

下面我们使用KO创建一个视图模型:

 

你可以使用依赖绑定去创建一个非常简单的视图去呈现该视图模型。例如,下面的代码将显示personName的值:

 

使用knockout执行绑定

虽然data-bind并不是HTML中原生态的属性,但是它不会有任何问题。浏览器也无法知道它的含义,所以你需要使用knockout使其有效果。

 

下面我们将使用knockout执行绑定:

 

打开页面你将看到和下面的html一样的结果:

 

下面是关于applyBindings参数的说明:

第一个参数是你想激活依赖绑定的视图模型

第二个参数是可选的,主要是用来规定需要绑定的视图对象,比如我们可以这么写ko.applyBindings(myViewMode,document,getElementById(‘someElementId’))。

 

监控属性

现在你已经会创建基本的视图模型了,下面我们还要学习如何监控视图模型中的数据,从而可以在视图模型中的数据发生改变的时候将视图也改变。

 

下面我们将之前的视图模型改写:

 

现在你不需要手动保持视图的更新,这些会由knockout帮你自动更新。一旦视图模型的被监控的属性发生改变对应的视图也会随之改变。

 

读取和写监控属性

读取为当前命名为该属性名称的函数,不含有任何参数。

写为当前命名为该属性名的函数,并加上需要赋的值。

 

显式订阅监控属性事件

虽然knockout帮我们自动更新了视图,但是有时候我们需要对传入的值进行判断,那么我们就需要订阅这个事件。

 

下面我们可以通过subscribe进行订阅:

 

下面是关于该函数的参数说明:

第一个参数是指定回调的函数,第二个参数是可选的,用来指定回调函数执行的上下文,第三个参数是需要订阅的事件类型(默认为change,另一个是beforeChange)。

 

同时该函数还会返回一个对象,我们可以通过该返回值取消订阅,比如下面所示的代码:

 

Knockout默认情况下,如果赋的值跟当前属性的值相同,是不会触发change事件的,但是有时我们需要让其也能够触发,那么我们可以加上如下的代码:

 

延迟触发事件

笔者看到这个一时还不知道具体运用在哪,这里就顺便带以下吧,主要跟上面的方式相同,时间是毫秒:

 

下面是笔者的测试代码:

 1 <input type="text" data-bind="value: personName" />
 2 
 3     <script type="text/javascript">
 4         var myViewModel = {
 5             personName: ko.observable("Job"),
 6             personAge: ko.observable(123)
 7         };
 8 
 9         //myViewModel.personName.extend({ notify: "always" });
10 
11         myViewModel.personName.extend({ rateLimit: 1000 });
12 
13         myViewModel.personName.subscribe(function (oldValue) {
14             console.log("the old value is " + oldValue);
15         }, null, "beforeChange");
16         
17         myViewModel.personName.subscribe(function (newValue) {
18             console.log("the new value is " + newValue);
19         });
20 
21         myViewModel.personName("Job");
22 
23         myViewModel.personName("Job");
24 
25         ko.applyBindings(myViewModel);
26     </script>
View Code