原文地址:http://knockoutjs.com/documentation/extenders.html

原文名称:Using extenders to augment observables

本文参照:http://www.cnblogs.com/haogj/archive/2013/06/11/3132150.html

在值发生变化的时候,Knockout 的可观察对象提供了基本的功能来支持读/写,以及通知订阅者。在有些情况下,你可能希望能为可观察对象添加一些功能. 包括增加一些属性,或者通过为可观察对象增加写入的附加处理, Knockout 扩展器提供了一种简单并且灵活的途径,支持实现参数化的可观察对象。

如何创建一个扩展器

创建扩展器涉及到为 ko.extenders 对象添加一个函数,在这个函数被调用的时候,可观察对象将作为第一个参数,其它的选项被作为第二个参数。函数既可以返回可观察对象本身,也可以返回通过某种方式创建的新的可观察对象。

下面是一个简单的例子,logChange 扩展订阅了主题对象,提供了一个可配置的提示信息,在可观察对象发生变化的时候,在控制台输出这个提示信息和可观察对象的最新值。

ko.extenders.logChange = function(target, option) {
target.subscribe(function(newValue) {
console.log(option + ": " + newValue);
});
return target;
};

通过在可观察对象上调用 extend 函数可以使用这个扩展,extend 的参数是一个对象,其中名为 logChange 的属性表示使用这个扩展,属性的值就是扩展函数的第二个参数的值。

this.firstName = ko.observable("Bob").extend({logChange: "first name"});

这样,如果 firstName 可观察对象的值修改为 Ted ,就会在控制台输出 first name: Ted.

示例1:强制输入数字

这个示例创建一个扩展强制对可观察对象只能提供带有指定小数位数的数字。在这里,扩展器创建了一个新的允许写的支持计算的可观察对象,注入在真正的可观察对象之前进行写入处理。

aaarticlea/png;base64,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" alt="" />

视图的源代码显示如下:

<p><input data-bind="value: myNumberOne" /> (round to whole number)</p>
<p><input data-bind="value: myNumberTwo" /> (round to two decimals)</p>

View model 源代码:

ko.extenders.numeric = function(target, precision) {
//create a writeable computed observable to intercept writes to our observable
var result = ko.computed({
read: target, // 返回源对象的值
write: function(newValue) {
var current = target(),
roundingMultiplier = Math.pow(10, precision),
newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue),
valueToWrite = Math.round(newValueAsNum * roundingMultiplier) / roundingMultiplier; // 如果发生变化了,写入源对象
if (valueToWrite !== current) {
target(valueToWrite);
} else {
//if the rounded value is the same, but a different value was written, force a notification for the current field
if (newValue !== current) {
target.notifySubscribers(valueToWrite);
}
}
}
}); //initialize with current value to make sure it is rounded appropriately
result(target()); //return the new computed observable
return result;
}; function AppViewModel(one, two) {
this.myNumberOne = ko.observable(one).extend({ numeric: 0 });
this.myNumberTwo = ko.observable(two).extend({ numeric: 2 });
} ko.applyBindings(new AppViewModel(221.2234, 123.4525));

示例中2:为可观察对象添加验证

这个示例为可观察对象添加一个必须提供的验证扩展。不会返回新对象,这个扩展为可扩展对象添加了一个子可观察对象。由于可观察对象实际上是一个函 数,可以拥有真正的属性。然而,当视图模型转换为 JSON 的时候,子可观察对象将会被丢弃掉,而留下真正的可观察对象的值。对于仅仅与 UI 相关而不需要发送回服务器的情况,是一个不错的添加功能的方式。

视图代码如下:

<p data-bind="css: { error: firstName.hasError }">
<input data-bind='value: firstName, valueUpdate: "afterkeydown"' />
<span data-bind='visible: firstName.hasError, text: firstName.validationMessage'> </span>
</p>
<p data-bind="css: { error: lastName.hasError }">
<input data-bind='value: lastName, valueUpdate: "afterkeydown"' />
<span data-bind='visible: lastName.hasError, text: lastName.validationMessage'> </span>
</p>

拓展和视图模型的实现:

ko.extenders.required = function(target, overrideMessage) {
// 添加子可观察对象
target.hasError = ko.observable();
target.validationMessage = ko.observable(); // 执行验证的函数
function validate(newValue) {
target.hasError(newValue ? false : true);
target.validationMessage(newValue ? "" : overrideMessage || "This field is required");
} // 初始验证
validate(target()); // 当值发生变化的时候进行验证
target.subscribe(validate); // 返回源可观察对象
return target;
}; function AppViewModel(first, last) {
this.firstName = ko.observable(first).extend({ required: "Please enter a first name" });
this.lastName = ko.observable(last).extend({ required: "" });
} ko.applyBindings(new AppViewModel("Bob","Smith"));

应用多个扩展

也可以对可观察对象应用多个扩展。

this.firstName = ko.observable(first).extend({ required: "Please enter a first name", logChange: "first name" });

在这个例子中,可观察对象应用了两个扩展。

使用 Knockout 扩展器扩展 observables的更多相关文章

  1. (初)Knockout 监控属性(Observables)

    1 创建带有监控属性的view model 1.1 Observables Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tr ...

  2. 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 4 - 验证

    验证: 快要完成我们程序的界面部分了.剩下的事情就是在用户点击 "保存" 的时候管理验证问题了.验证是主要需求,今天就是最无知的应用也不会忽视它.通过正确的验证,用户可以知道应该输 ...

  3. (九)Knockout 进一步技术

    加载和保存 JSON 数据 Knockout允许您实现复杂的客户端交互,但是几乎所有web应用程序还需要与服务器交换数据,或者至少要序列化数据以供本地存储.交换或存储数据最方便的方式是JSON格式-- ...

  4. 翻译:Knockout 快速上手 - 4: 你需要知道的顶级特性

    Knockout 最棒的一个特点就是它的可扩展性.Knockout 存在大量的扩展点,包含大量的工具来创建我们的应用程序.许多开发者除了 Knockout 核心库之外没有使用任何其他的脚本库 ( 甚至 ...

  5. Knockout 可扩展性

    你需要知道的顶级特性 Knockout 最棒的一个特点就是它的可扩展性.Knockout 存在大量的扩展点,包含大量的工具来创建我们的应用程序.许多开发者除了 Knockout 核心库之外没有使用任何 ...

  6. MVVM架构~Knockoutjs系列之验证机制的引入

    返回目录 对于Knockoutjs本身来说,没有提供验证模块,不过,有第三方的扩展,就像你为jquery库作extensions一样,这讲中我将介绍一个Knockout插件扩展,knockout.va ...

  7. GPIO接口解析【转】

    本文提供了一个linux下访问GPIO的约定的概述. 这些调用使用gpio_* 命名前缀.没有别的调用会使用这个前缀或是相关的__gpio_*前缀. 转自:http://blog.163.com/w5 ...

  8. 算法语言Scheme修订6报告 R6RS简体中文翻译

    算法语言Scheme修订6报告 R6RS简体中文翻译 来源 https://r6rs.mrliu.org/   MICHAEL SPERBERR. KENT DYBVIG, MATTHEW FLATT ...

  9. 关于WPF你应该知道的2000件事

    原文 关于WPF你应该知道的2000件事 以下列出了迄今为止为WPF博客所知的2,000件事所创建的所有帖子. 帖子总数= 1,201 动画 #7 - 基于属性的动画 #686 - 使用动画制作图像脉 ...

随机推荐

  1. 【LeetCode】172. Factorial Trailing Zeroes

    Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. Note: Your ...

  2. office2010安装Microsoft Office Document Imaging (MODI) 图解

    office2010安装Microsoft Office Document Imaging (MODI) 图解     Microsoft Office 2010 中删除了 Microsoft Off ...

  3. js打印方法总结

    前段时间做web项目用到了页面打印,在网上找了些资料,自己也试了很多方法,将这些方案列出下: 1.window.print()方法打印,所有主要浏览器都支持 print() 方法 这个方法很实用,只需 ...

  4. css 设置样式

    前台div <div id="DIV1" runat="server" > </div> 后台: this.DIV1.Style.Val ...

  5. 解决input之间的空隙

    <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name ...

  6. 【转】高性能Javascript--脚本的无阻塞加载策略

    原文转自:http://blog.jobbole.com/78191/ Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题. 在Yahoo的Yslow23条规则当中, ...

  7. c#使用正则表达式替换html标签

    /// <summary> /// 去除HTML标记(用正则彻底去除HTML\CSS\script代码 ) /// </summary> /// <param name= ...

  8. Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

    1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...

  9. 几个有用的SAP安全配置的用户参数配置列表

    转自http://blog.sina.com.cn/s/blog_4f913cf80100mksj.html Parameter Brief Description login/min_passwor ...

  10. Codeforces Round #368 (Div. 2)A B C 水 图 数学

    A. Brain's Photos time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...