Knockout js类库学习笔记(一)数据绑定

KnockoutJS是一个常用的JS框架,目的为减少开发者在使用JS或JQuery时大量的DOM操作所导致的操作代码复杂且难以理解,并且有助于数据与HTML的分离,在团队中大家统一认同此框架的前提下,能够提高开发效率。

本人也是最近开始使用这套框架,并且记录下一般性的使用心得,以备日后查阅。如果能够帮助大家解决一些自己的问题,实属超出预计。:)

所有关于下载,API查阅,示例均在此http://knockoutjs.com/

首先引入Knockout文件knockout-3.0.0.js和knockout.mapping.min.js两个必要文件,Knockout可以独立于JQuery类库运行,So Jquery类库不是必要条件。

Knockout最强大和最常用的工具在于双向绑定(TwoWay-binding),适用于任何需要绑定数据的场景。使用也很简单方便。这里分为多个示例讲解一些常见的binding

HTML(为保证重复利用,这是所有代码共用之HTML):

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="js/jquery-1.9.1.min.js" type="text/javascript"></script>
    <script src="js/knockout/knockout-3.0.0.js" type="text/javascript"></script>
    <script src="js/knockout/knockout.mapping.min.js" type="text/javascript"></script>
    <script src="js/knockout/koExternalTemplateEngine_all.min.js" type="text/javascript"></script>
    <script src="js/JScript1.js" type="text/javascript"></script>

    <style>
        #testDiv .Selected
        {
        	background-color:Red;
        	width:50px;
        }
        .NotSelected
        {
        	background-color:Yellow;
        	width:50px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div id ="testDiv">
            <input type="text" data-bind="value:FirstName"></input><br/>
            <input type="text" data-bind="value:LastName"></input><br/>
            <span data-bind="text:FullName"></span>
            <span data-bind="css:{Selected:FirstName()=='Arwind2014', NotSelected:FirstName()!='Arwind2014'}" class="NotSelected">ooo</span>
            <a data-bind="attr:{href:Url()}">Tecent</a>


            <div>
                <ul data-bind="foreach:SubViewMode;">
                    <li data-bind="text:Name">1</li>
                </ul>
            </div>



            <div data-bind="with:SubViewMode2;">
                <ul data-bind="foreach:Items">
                    <li data-bind="text:Name">1</li>
                </ul>
            </div>

            <input type="button" value="TestButton" data-bind="click:ClickTest" />
            <input type="button" value="TestButton2" data-bind="event:{click:ClickTest}" />
            <input type="button" value="TestButton3" data-bind="event:{click:function(data, event){ClickJoinName('arwind','gao')}}" />

            <input type="button" value="TestCount" data-bind ="click:ClickCount" />
            <span data-bind="text:CountValue"></span>
    </div>
    </form>
</body>

注意js改为自己的路径。

示例一:

简单observable绑定

    var TestModel = {};
    TestModel.FirstName = ko.observable("Arwind");
    TestModel.LastName = ko.observable("Gao");
    TestModel.FullName = ko.computed(function () {
        return TestModel.FirstName() + " " + TestModel.LastName();
    });


简单的一个Model类  对应之HTML

            <input type="text" data-bind="value:FirstName"></input><br/>
            <input type="text" data-bind="value:LastName"></input><br/>
            <span data-bind="text:FullName"></span>


JS最后需要添加绑定代码(这段代码只需添加在最后,仅需添加一次,之后示例不再赘述)

    ko.applyBindings(TestModel, document.getElementById("testDiv"));


 

上面的代码只能执行一次 若需要相应数据的变化 如ajax请求导致多次绑定,需要多加判断,例如此Model直接从Json数据mapping过来,则只需再次mapping改变model的值即可改变HTML端:

                    if (TestModel == undefined) {
                        TestModel = ko.mapping.fromJS(girds);
                        ko.applyBindings(TestModel, document.getElementById("testDiv"));
                    }
                    else {
                        ko.mapping.fromJS(girds, {}, TestModel);
                    }


示例二:

css的绑定

    <style>
        #testDiv .Selected
        {
        	background-color:Red;
        	width:50px;
        }
        .NotSelected
        {
        	background-color:Yellow;
        	width:50px;
        }
    </style>


HTML

            <span data-bind="css:{Selected:FirstName()=='Arwind2014', NotSelected:FirstName()!='Arwind2014'}" class="NotSelected">ooo</span>


示例三

URL的绑定

HTML

<a data-bind="attr:{href:Url()}">Tecent</a>


 

Knockout

    TestModel.Url = function () {
        return "www.baidu.com";
    };


 

示例四

子Model嵌套绑定

Knockout

    //with用于子model绑定
    TestModel.SubViewMode = [{ Name: "Name1" }, { Name: "Name2"}];
    TestModel.SubViewMode2 = { Items: [{ Name: "Name1" }, { Name: "Name2"}] };


 

HTML

            <div>
                <ul data-bind="foreach:SubViewMode;">
                    <li data-bind="text:Name">1</li>
                </ul>
            </div>



            <div data-bind="with:SubViewMode2;">
                <ul data-bind="foreach:Items">
                    <li data-bind="text:Name">1</li>
                </ul>
            </div>


 

示例五

事件绑定

HTML

            <input type="button" value="TestButton" data-bind="click:ClickTest" />
            <input type="button" value="TestButton2" data-bind="event:{click:ClickTest}" />


 

Knockout

    TestModel.ClickTest = function () {
        alert("test");
    };


 

示例六

带参数的事件绑定

HTML

            <input type="button" value="TestButton3" data-bind="event:{click:function(data, event){ClickJoinName('arwind','gao')}}" />


 

Knockout

    TestModel.ClickJoinName = function (FirstName, LastName) {
        alert(FirstName + "," + LastName);
    };


 

示例七

简单observable计数器

HTML

            <input type="button" value="TestCount" data-bind ="click:ClickCount" />
            <span data-bind="text:CountValue"></span>

Knockout

    TestModel.CountValue = ko.observable(0);
    TestModel.ClickCount = function () {
        var v = this.CountValue();
        this.CountValue(v + 1);
    };


先到这里吧 下次再说..

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Bindable.js 实现了灵活、快速的双向数据的 JavaScript 。 Two-way data binding means linking properties of two separate objects - when one changes, the other will automatically update with that change.  It enables much easier interactions between data models and UIs, among other uses outside of MVC. Bindable.js is similar to Ember's data-binding system, except it doesn't include anything View related, so the library has many use-cases - whether replacing Backbone's Model, providing a way to maintain the state between server <-> client for a realtime front-end application (similar to Firebase), or perhaps a way to communicate between server <-> server for a realtime distributed Node.js application. Projects using bindable.js Paperclip.js - data-bindable templating engine. Sherpa.js - online tours library Mojo.js - javascript MVC framework. AWSM - aws library. ditto - synchronized user interactions across browsers. 示例代码: var bindable = require("bindable"); var person = new bindable.Object({   name: "craig",   last: "condon",   location: {     city: "San Francisco"   } }); person.bind("location.zip", function(value) {   // 94102 }).now(); //triggers the binding person.set("location.zip", "94102");  //bind location.zip to another property in the model, and do it only once person.bind("location.zip", { to: "zip", max: 1 }).now(); //bind location.zip to another object, and make it bi-directional. person.bind("location.zip", { target: anotherModel, to: "location.zip", bothWays: true }).now(); //chain to multiple items, and limit it! person.bind("location.zip", { to: ["property", "anotherProperty"], max: 1 }).now(); //you can also transform data as it's being bound person.bind("name", {   to: "name2",   map: function (name) {     return name.toUpperCase();   } }).now(); 标签:Bindable
Knockout.js 是一个基于 MVVM 架构的 JavaScript 框架,它可以帮助我们实现数据、模板渲染、事件等功能。要显示上传文件的进度,我们可以使用 XMLHttpRequest 对象来发送文件,并使用 Knockout.js 来更新进度条的值。 首先,我们需要义一个 ViewModel,用来页面上的元素和数据: ``` function ViewModel() { var self = this; self.uploadProgress = ko.observable(0); self.uploadFile = function() { var fileInput = document.getElementById("fileInput"); var file = fileInput.files[0]; var xhr = new XMLHttpRequest(); xhr.upload.addEventListener("progress", function(event) { if (event.lengthComputable) { var percentComplete = event.loaded / event.total * 100; self.uploadProgress(percentComplete); } }, false); xhr.open("POST", "/upload"); xhr.send(file); }; } ko.applyBindings(new ViewModel()); ``` 在这个 ViewModel 中,我们义了一个 uploadProgress 可观察的属性,它用来页面上的进度条。我们还义了一个 uploadFile 方法,用来上传文件。在上传文件的过程中,我们使用 XMLHttpRequest 的 upload 事件来监听文件上传的进度,如果进度发生变化,我们就更新 uploadProgress 的值,从而更新页面上的进度条。 在 HTML 代码中,我们可以使用 Knockout.js数据语法来 uploadProgress 属性,以显示进度条: ``` <input type="file" id="fileInput"> <button data-bind="click: uploadFile">Upload File</button> <div class="progress"> <div class="progress-bar" role="progressbar" style="width: 0%;" data-bind="style: { width: uploadProgress() + '%' }"> <span data-bind="text: uploadProgress() + '%'"></span> </div> </div> ``` 在这个 HTML 代码中,我们使用了 Bootstrap 的进度条样式,并使用了 Knockout.js数据语法来 uploadProgress 属性。当 uploadProgress 的值发生变化时,进度条的宽度和文本也会相应地更新。 总结一下,要显示上传文件的进度,我们可以使用 XMLHttpRequest 对象来发送文件,并使用 Knockout.js 来更新进度条的值。我们可以义一个 ViewModel,用来页面上的元素和数据义一个 uploadFile 方法,用来上传文件,使用 XMLHttpRequest 的 upload 事件来监听文件上传的进度,如果进度发生变化,就更新 uploadProgress 的值,从而更新页面上的进度条。在 HTML 代码中,我们可以使用 Knockout.js数据语法来 uploadProgress 属性,以显示进度条。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值