`
ljl_xyf
  • 浏览: 636876 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Knockoutjs实战开发:属性监控(Observables)和依赖跟踪(Dependency tracking )

 
阅读更多

昨天我们通过Knockoutjs环境搭建一 文对Knockoutjs进行了简单的了解,我们在使用Js的很多情况下都是为了实现页面的局部刷新从而可以获得数据,使用Knockoutjs的情况也 不例外,在Knockoutjs中提供了属性监控(Observables)和依赖跟踪(Dependency tracking)这两个概念,通过它们可以对我们所关心的控件(比如:text文本框)实现动态监控,这样,当空间的值改变或者出现对应的事件 是,Knockoutjs可以对其最初相应的反应(此反应不需要刷新页面),从而得到我们想要的结果。

下面我们来看一个比较经典的例子:一个人的名字由“姓”和“名”组成,由用户输入一个姓名,中间由空格隔开,然后通过span动态显示用户的姓和名。代码如下:

<script type="text/javascript" src="knockout-2.2.0.js"></script>

<p>First name: <span data-bind="text: firstName"></span></p> 
<p>Last name: <span data-bind="text: lastName"></span></p> 
<h2>Hello, <input data-bind="value: fullName"/>!</h2>
  
<script type="text/javascript">
    function MyViewModel() {
        this.firstName = ko.observable('桲');
        this.lastName = ko.observable('');

        this.fullName = ko.computed({
            read: function () {
                return this.firstName() + " " + this.lastName();
            },
            write: function (value) {
                var lastSpacePos = value.lastIndexOf(" ");
                if (lastSpacePos > 0) {  
                    this.firstName(value.substring(0, lastSpacePos));
                    this.lastName(value.substring(lastSpacePos + 1)); 
                }
            },
            owner: this
        });
    }

    ko.applyBindings(new MyViewModel());
</script>

 在讲解以上的代码之前,我们首先来了解一下MVVM(Model-View-View Model)的概念

一、MVVM(Model-View-View Model)

     MVVM是一种用户界面的设计模式,它将精巧、复杂的设计算法隐藏在用户界面的背后,从而使我们可以更加方便的使用它。它分为以下的三个部分:

   (1)、Model层:此类似于MVC中的Model层,用来保存我们应用程序的数据。在使用Knockoutjs时,我们通常是使用Ajax来向服务端付出请求来读写Model层的数据的。

   (2)、View Model层:此层是建立在UI上面的纯粹的数据操作。它是和我们的HTML代码分离开来的JavaScript对象,但并不代表持久化对象,它只是对用 户正在操作的且没有进行保存的数据,此设计可以保持View Model的纯洁性,从而能更好的处理复杂的数据操作。

   (3)、View层:此层是用户可以看到的,它用来显示从View Model层传递过来的数据、发出请求命令(比如用户点击了某个Button)、当View Model的值改变时作出相应的更新等。在使用Knockoutjs时,此层仅仅代表HTML页面或者是服务端通过模版生成的HTML页面。

在了解完MVVM的概念后,我们就可以着手分析以上的代码了:

 

二、首先定义ViewModel

function MyViewModel(){}

 在此ViewModel中又定义了三个属性:

this.firstName = ko.observable('桲');
 this.lastName = ko.observable('');
 
 this.fullName = ko.computed({});

 

我们先来看前两个属性,即:firstName和lastName,这两个属性都是使用ko.observable()来定义的,使用此方法来定义 就是告诉Knockoutjs属性firstName和lastName需要进行属性监控,这样当firstName和lastName的值改变时,就会 触动对应的View层的组件做出相应的改变,这样才会实现当用户输入完fullName之后,firstName和lastName做出相应的改变。


三、Computed Observables(组合监控属性)

我们在定义第三个fullName属性时使用的是:ko.computed()方法,此方法代表将多个监控属性组合到一起(在这里我们将 firstName和lastName进行组合形成了fullName),当组合属性中的任何一个监控属性的值改变时,组合属性的值也会做出相应的改变。

this.fullName = ko.computed({
             read: function () {
                 return this.firstName() + " " + this.lastName();
             },
             write: function (value) {
                 var lastSpacePos = value.lastIndexOf(" ");
                 if (lastSpacePos > 0) {  
                     this.firstName(value.substring(0, lastSpacePos));
                     this.lastName(value.substring(lastSpacePos + 1)); 
                 }
             },
             owner: this
         });

 

在此例中,我们使用了组合属性的三个参数:read、write和owner。其中,

 (1)、read是必须的,表示返回此组合属性的值。

 (2)、write是可选的,如果我们使用此属性,则代表此组合属性是可写的,当从View层传入一个value值,则我们可以根据自己的需要对值进行处理。这里我需要将value根据空格拆分,然后分别赋值给firstName和lastName。
 (3)、owner可选,一般值为this。

 

四、激活属性监控

ko.applyBindings(new MyViewModel());

 

这里我们使用ko.applyBindings()对我们定义的MyViewModel进行激活,这样我们在进行绑定时就可以看到各个属性的值,如果没有进行激活的话,则不会显示对应属性的值,这点我们要注意了。

 

五、绑定属性到View层

<p>First name: <span data-bind="text: firstName"></span></p> 
 <p>Last name: <span data-bind="text: lastName"></span></p> 
 <h2>Hello, <input data-bind="value: fullName"/>!</h2>

 

这里使用data-bind分别对firstName、lastName和fullName进行了绑定,这样我们就可以看到各个属性的值了。

 

六、为什么使用组合属性(Computed Observables)

 在使用组合属性(Computed Observables)时,我们可以对我们想要处理的属性或者验证做出相应的措施,比如:

 (1)、值的转换

   我们可以通过以下的代码将对应的输入表示为对应的金额输出到页面: 

<script type="text/javascript" src="knockout-2.2.0.js"></script>
 
 <p>Enter bid price: <input data-bind="value: formattedPrice"/></p>
   
 <script type="text/javascript">
     function MyViewModel() {
         this.price = ko.observable(25.99);
 
         this.formattedPrice = ko.computed({
             read: function () {
                 return 'ㄓ' + this.price().toFixed(2);
             },
             write: function (value) {
                 value = parseFloat(value.replace(/[^\.\d]/g, ""));
                 this.price(isNaN(value) ? 0 : value);  
             },
             owner: this
         });
     }
 
     ko.applyBindings(new MyViewModel());
 </script>

 

(2)、用户输入验证,只允许输入数字

 <script type="text/javascript" src="knockout-2.2.0.js"></script>
 
 <p>Enter a numeric value: <input data-bind="value: attemptedValue"/></p> 
 <div data-bind="visible: !lastInputWasValid()">That's not a number!</div>
   
 <script type="text/javascript">
     function MyViewModel() {
         this.acceptedNumericValue = ko.observable(123);
         this.lastInputWasValid = ko.observable(true);
 
         this.attemptedValue = ko.computed({
             read: this.acceptedNumericValue,
             write: function (value) {
                 if (isNaN(value))
                     this.lastInputWasValid(false);
                 else {
                     this.lastInputWasValid(true);
                     this.acceptedNumericValue(value); 
                 }
             },
             owner: this
         });
     }
 
     ko.applyBindings(new MyViewModel());
 </script>

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    KnockoutJS-Starter:PacktPub KnockoutJS 入门书的片段和示例

    - **KnockoutJS**:是我们的主要关注点,它通过数据绑定和依赖跟踪,实现了视图与模型之间的自动同步。它使得JavaScript对象可以直接控制HTML元素,无需手动操作DOM。 **核心知识点**: 1. **MVVM模式**:...

    KnockoutJS

    **KnockoutJS**,简称KO.js,是一个轻量级的JavaScript库,专注于MVVM(Model-View-ViewModel)设计模式,使得在Web开发中实现数据绑定和动态用户界面变得简单易行。它通过双向数据绑定特性,允许开发者在视图和模型...

    knockoutjs-jogging:KnockoutJS 的每日提交

    6. **依赖跟踪**:KnockoutJS 自动管理 Observable 和 Computed Property 之间的依赖关系,确保只有真正需要更新的部分才会被重新计算。 7. **命令(Commands)**:在 KnockoutJS 中,你可以定义可观察的命令来处理...

    KnockoutJS-brackets:支架的扩展Kong

    可以在Brackets-preference文件中分别禁用所有功能: " ericsmekens.knockoutjs.show_icon " : true ," ericsmekens.knockoutjs.code_hint " : true ," ericsmekens.knockoutjs.quick_edit " : true发行说明0.1.0 ...

    knockoutjs-timer:一个用 KnockoutJS 构建的简单计时器,可以启动、停止和重置

    你可以通过官方文档、教程和示例项目来深入学习 KnockoutJS 的更多特性,比如计算属性、依赖跟踪、模板等。 总之,“knockoutjs-timer”项目提供了一个实践 KnockoutJS 数据绑定和事件处理的实例,对于初学者来说,...

    KnockoutJs 帮助文档 中文手册

    它使用MVVM(Model-View-ViewModel)模式,帮助开发者实现数据绑定和依赖跟踪,使得视图与数据模型之间的交互变得更加简单。中文手册提供了全面的指导,使国内开发者更容易理解和应用这个库。 ### MVVM模式 MVVM是...

    knockoutjs-sparkline:全能 jQuery Sparkline 的 KnockoutJS 自定义绑定

    Knockoutjs-sparkline 全能 jQuery Sparkline 的 KnockoutJS 自定义绑定 依赖 没有凉亭。 项目与 Bower 重生。 扩展选项 TODO:这些可以通过将对象传递给绑定器而不是使用单独的绑定来以更友好的 KnockoutJS ...

    knockoutJs-components:使用基因剔除创建的自定义组件

    - **定义**:KnockoutJS组件是一种可重用的UI模块,它们可以包含HTML模板、JavaScript代码和相关的依赖项。 - **注册组件**:在KnockoutJS中,可以通过`ko.components.register`函数注册一个组件,指定其模板和...

    knockoutjs-reactor:无论可观察对象嵌套的深度有多深,或者它们是否嵌套在动态创建的数组元素中,都以递归方式跟踪视图模型中的更改

    KOReact器一个KnockoutJS插件,可让您无缝定位视图模型中的所有更改,并能够即时定位和处理它们。 它不需要对标记或视图模型本身进行任何修改,因此非常适合测试和快速制作原型。 用法: ko.watch...

    knockoutjs-presentation:Knockout.js演示文稿

    impress.js 这是一个展示框架,基于现代浏览器中CSS3转换和转换的功能,并受到prezi.com背后思想的启发。 警告如果您无话可说,那么impress.js可能对您没有帮助;...0.5.2(, , )文件发布在演示CSS和imp

    knockoutcrud:对Observables和Observable Array中的Crud项目的Knockoutjs扩展

    淘汰赛对Observables和Observable Array中的Crud项目的Knockoutjs扩展受到Ryan Niemeyer的“ Knockout.js的简单编辑器模式”的启发( )。 谢谢瑞安! 这是我在博客中的一个段落,我想:“如果您经常要重复使用这种...

    KnockoutJS中文文档新

    它通过数据绑定和依赖跟踪机制,使得开发者能够更轻松地管理DOM(Document Object Model)与应用程序模型之间的数据同步。 ### 1. MVVM模式 MVVM模式是KnockoutJS的核心设计理念。它将用户界面分为三个部分:模型...

    knockout 中文文档 官方文档 打包下载

    4. **依赖跟踪**:KnockoutJS 自动管理依赖关系,这意味着如果你改变了一个 observable,所有依赖它的 observables 或者表达式都会自动更新。 5. **订阅与发布**:knockoutJS的 observables 支持订阅和发布机制。你...

    KnockoutJS by Example源码

    当依赖的 observables 改变时,computed properties会自动更新。 5. **模板和扩展**:KnockoutJS支持内联模板和外部模板,源码中可能包含如何使用`&lt;script&gt;`标签定义模板,以及如何使用`template`绑定来渲染它们。...

    Asp.Net MVC 4 KnockoutJS 框架实例

    同时,KnockoutJS还提供了如依赖跟踪、订阅、计算属性等功能,使得数据管理更加灵活。 例如,一个简单的Asp.Net MVC 4控制器可能会有一个Action方法,该方法获取服务器上的数据并将其序列化为JSON,然后通过HTTP...

    KnockoutJS-i18n:一个简单的 KnockoutJS i18n 模块

    KnockoutJS-i18n 当前版本:0.2 依赖:KnockoutJS KnockoutJS-i18n 是一个简单的 KnockoutJS 模块,用于在您的 KO 网站中启用多语言。 KnockoutJS-i18n 使用 observable 或计算来创建和管理您的 Web 应用程序中的...

    KnockoutJs_帮助文档_中文手册 chm

    **KnockoutJS** 是一个轻量级的JavaScript库,专为构建富客户端应用程序而设计。...通过深入学习和实践这个中文手册,开发者可以熟练掌握KnockoutJS,从而更高效地开发交互性强、响应速度快的前端应用。

    knockout-app:使用KnockoutJS的基本功能性CRUD应用程序,演示了敲除映射插件和组件的用法

    KnockoutJS-的应用使用基本功能的CRUD(创建,读取,更新和删除)应用 。 该应用程序演示了如何使用AJAX加载,渲染和保存嵌套的JSON数据。 该应用程序使用: 以创建封装HTML组件或小部件, 使复杂的嵌套对象可...

    Knockoutjs快速入门(经典)

    2. Observables and dependency tracking 3. Templating 它对于分离前台的业务逻辑和视图简化数据绑定过程有显著的作用。闲言少叙,直接看例子,如何下载也不说了,如果用VS开发的话用Nuget就可以一键搞定。1.基本...

Global site tag (gtag.js) - Google Analytics