Knockout是构建在3个核心的特性上的:javascript
这一节,你讲学到3个核心特性中的第一个。 在这以前, 咱们来解释一下MVVM模式和view model的概念。html
模型-视图-视图模型(MVVM)是一种设计模式用来构建用户界面,它描述了如何让一个复杂的UI界面分解成3个部分:java
注意这不是UI自己:它不包含任何按钮的概念或者显示风格。它也不是持续数据模型 – 包含用户正在使用的未保存数据。使用KO的时候,你的view models是不包含任何HTML知识的纯JavaScript 对象。保持view model抽象能够保持简单,以便你能管理更复杂的行为。设计模式
使用KO的时候,你的view就是你带有绑定信息的HTML文档,这些声明式的绑定管理到你的view model上。或者你可使用模板从你的view model获取数据生成HTML。服务器
例如:建立一个KO的view model,只须要声明任意的JavaScript object,app
var myViewModel = { personName: 'Bob', personAge: 123 };
你能建立一个很是简单view model 用于声明绑定.框架
例如: 下面的代码显示personName 值函数
The name is <span data-bind="text: personName"></span>
激活Knockout,须要添加以下的 <script> 代码块:学习
ko.applyBindings(myViewModel);
你能够把脚本块放到你的HTML文档的的底部,也能够放在顶部用jQuery的$函数加载this
就这样了!如今,如过你写了下HTML代码你的的视图将显示:
The name is <span>Bob</span>
你可能比较疑惑,ko.applyBindings使用了什么参数?
ko.applyBindings(myViewModel, document.getElementById('someElementId'))
真的,很简单
好了,你已经看到了如何建立一个基本的view model 而且怎么去显示的去绑定它的属性。
可是KO有一个核心的功能,当你的view model发生改变的时候它会自动更新你的UI。
当你的view model发现改变时怎么才能让KO知道呢?
回答:你须要把模型的属性声明称监控属性,由于它是很是特殊的javascript对象,可以通知在改变的时候通知订阅者,而且可以自动侦测依赖。
例如:改写之前一个view model对象:
var myViewModel = { personName: ko.observable('Bob'), personAge: ko.observable(123) };
你没必要改变全部的视图 - 这些 data-bind 的语法继续保持工做。不一样的地方是它可以检测到改变,而且当使用的时候,它将会自动更新view.
不是全部的游览器都支持JavaScript getters 和 setter(* cough * IE * cough *),因此为了兼容,ko.observable 对象实际上一个 functions.
myViewModel.personName()
will return 'Bob'
, and myViewModel.personAge()
will return 123
.myViewModel.personName('Mary')
将把值变成'Mary'。data-bind="text: personName",
这个text会注册绑定它本身被通知改变,当personName的值改变,它就能获得通知(假设这是一个能够observable的值)。
当你用myViewModel.personName('Mary')改变这个name值是value = ’Mary’时,text绑定将自动更新这个新值到相应的DOM元素上,这就是如何改变视图模型自动传播到视图的。
一般来讲若是你不须要手动的去设置订阅,那么你能够跳过这一节。
对于高级用户,假如你想注册本身的订阅通知的变化来观察,你可以调用它的subscribe方法,例如
myViewModel.personName.subscribe(function(newValue) { alert("The person's new name is " + newValue); });
subscribe 方法在KO内部许多地方都被使用。大部分时间你都不须要用它,由于它是内置绑定而且是由模版系统管理订阅。
subscribe 有三个参数:
callback 回调函数,当发生的通知调用
target(可选)定义在回调函数中的this
event(可选默change—)接收通知的事件的名称
你也能够终止本身的订阅:首先获得你的订阅,而后调用这个对象的dispose函数,例如:
var subscription = myViewModel.personName.subscribe(function(newValue) { /* do stuff */ }); // ...then later... subscription.dispose(); // I no longer want notifications
若是你想被通知之前被监控的值,它被改变,你能够订阅的beforechange事件:
myViewModel.personName.subscribe(function(oldValue) { alert("The person's previous name is " + oldValue); }, null, "beforeChange");
当写一个了监控属性,它包含一个原始值时,若是dependencies依赖的observable正常状况下只会有value发生改变才会通知。然而,可使用内置的通知extender确保observable’s的订阅在写的时候老是会发出通知,即便值是相同的。你会运用extender到一个监控属性中:
myViewModel.personName.extend({ notify: 'always' });
本章完。