`
desert3
  • 浏览: 2159296 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

knockoutjs -- load save data(与服务器进行数据交互) & binding绑定

 
阅读更多
和服务器交互数据:
Knockout 是一纯javascript库,它可以与任何能发送和接收JSON数据的服务器进行交互。

从服务器取得数据:使用$.getJSON或者$.ajax从服务器端取得JSON数据,然后更新viewmodel。注意:你并不是在服务器下载完数据后才执行ko.applyBindings操作。不需要在从服务器下载数据完毕后重新进行绑定操作,因为当数据下载完毕后,Knockout 会自动根据viewmodel的状态来更新相应的UI.

提交数据到服务器:
  • 方法1,简单地使用Html from控件,在控件内部放要提交到服务器的JSON的值(放一个隐藏域,其值通过toJSON方法取到,data-bind="value: ko.toJSON(tasks)"),然后再放置一个Submit按钮。如下:type="submit"
  • 方法2,使用ajax方法,提交需要的数据给服务器,然后服务器处理。如下:self.save
  • 3,客户端删除数据更新,你并不需要通过和数据库的数据必须比较来了发现客户端删除了哪些数据。当操作observable数组的时候,不使用self.tasks.remove(task)来直接删除数据,而是使用self.tasks.destroy(task)。destroy方法并不真正删除数据,而是在数据中增加_destroy属性(foreach会自动根据_destroy属性而不显示被删除记录),然后提交到服务器后,服务器端解析_destroy就能知道客户端用户请求删除哪些数据。使用destroy方法后,原来的统计数字不正确了,修改统计方法,增加&& !task._destroy判断。

<h3>Tasks</h3>

<form data-bind="submit: addTask">
    Add task: <input data-bind="value: newTaskText" placeholder="What needs to be done?" />
    <button type="submit">Add</button>
</form>

<ul data-bind="foreach: tasks, visible: tasks().length > 0">
    <li>
        <input type="checkbox" data-bind="checked: isDone" />
        <input data-bind="value: title, disable: isDone" />
        <a href="#" data-bind="click: $parent.removeTask">Delete</a>
    </li>
</ul>

You have <b data-bind="text: incompleteTasks().length">&nbsp;</b> incomplete task(s)
<span data-bind="visible: incompleteTasks().length == 0"> - it's beer time!</span>

<form action="/tasks/saveform" method="post">
    <textarea name="tasks" data-bind="value: ko.toJSON(tasks)"></textarea>
    <input type="hidden" name="tasks" type="hidden" data-bind="value: ko.toJSON(tasks)" />
    <button type="submit">Save</button>
</form>

<button data-bind="click: save">Save</button>

function Task(data) {
    this.title = ko.observable(data.title);
    this.isDone = ko.observable(data.isDone);
}

function TaskListViewModel() {
    // Data
    var self = this;
    self.tasks = ko.observableArray([]);
    self.newTaskText = ko.observable();
    self.incompleteTasks = ko.computed(function() {
        return ko.utils.arrayFilter(self.tasks(), function(task) { return !task.isDone() });
    });

    // Operations
    self.addTask = function() {
        self.tasks.push(new Task({ title: this.newTaskText() }));
        self.newTaskText("");
    };
    // self.removeTask = function(task) { self.tasks.remove(task) };
    self.removeTask = function(task) { self.tasks.destroy(task) };
    
    // Load initial state from server, convert it to Task instances, then populate self.tasks
    $.getJSON("/tasks", function(allData) {
        var mappedTasks = $.map(allData, function(item) { return new Task(item) });
        self.tasks(mappedTasks);
    });    
    
    self.save = function() {
        $.ajax("/tasks", {
            data: ko.toJSON({ tasks: self.tasks }),
            type: "post", contentType: "application/json",
            success: function(result) { alert(result) }
        });
    };
}

ko.applyBindings(new TaskListViewModel());


绑定:
在MVVM解释器中,bindings绑定是把用户的视图view和viewmodel关联起来,bindings就是中间人,它执行双向更新:
  • binding发现viewmodel 发生变化,然后更新相应的view的DOM
  • binding捕获DOM events事件,然后更新viewmodel的属性

Knockout 有一个灵活的,综合的内置绑定集合(包含如text, click, foreach等),同时你也可以使用少量代码来完成自定义的bindings 。
自定义binding
1,给ko.bindingHandlers增加新的绑定属性,然后实现下面2个回调方法
2,init:在绑定刚开始的时候被调用,一般用来设置初始状态或者注册事件处理器
3,update:当关联的data发生变化的时候被调用,一般用来更新data相应的DOM
自定义fade binding例子:
ko.bindingHandlers.fadeVisible = {
    init: function(element, valueAccessor) {
        // Start visible/invisible according to initial value
        var shouldDisplay = valueAccessor();
        $(element).toggle(shouldDisplay);
    },
    update: function(element, valueAccessor) {
        // On update, fade in/out
        var shouldDisplay = valueAccessor();
        shouldDisplay ? $(element).fadeIn() : $(element).fadeOut();
    } 
};

<h3 data-bind="fadeVisible: pointsUsed() > pointsBudget">You've used too many points! Please remove some.</h3>


也可以集成第三方web组件,如jquery UI,参考:http://learn.knockoutjs.com/#/?tutorial=custombindings
分享到:
评论

相关推荐

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

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

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

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

    knockoutjs-jogging:KnockoutJS 的每日提交

    KnockoutJS 提供了一个强大的数据绑定系统,使得 ViewModel 中的数据变化能够自动反映到 View 上,反之亦然。这大大简化了 UI 更新的复杂性,特别是在处理大量数据和交互时。 在 "knockoutjs-jogging" 中,我们可以...

    KnockOutJS-GoogleMaps

    KnockOutJS示例 当用户在地图上选择标记时,用于添加,编辑和删除Google地图中的地点并显示instagram图片和yelp信息的应用程序。 来自UdacityJavaScript设计模式课程的项目 Google Map Javacript API的使用 使用...

    knockoutjs-example

    **KnockoutJS** 是一个轻量级的MVVM(Model-View-ViewModel)JavaScript库,主要用于构建富交互性的Web应用程序。它通过数据绑定和依赖跟踪机制,使得开发者能够更轻松地管理DOM元素与JavaScript对象之间的关系。在...

    KnockoutJS

    在服务器端,Nhibernate负责处理数据持久化,而在客户端,KnockoutJS处理用户界面和数据的动态交互。通过JSON格式,Nhibernate可以将数据库中的数据传递给KnockoutJS,然后在前端进行展示和操作。`Knockout.Mapping`...

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

    在 KnockoutJS 中,ViewModel 是一个 JavaScript 对象,它包含应用程序的状态和业务逻辑,同时通过数据绑定与 View 进行交互。当 ViewModel 的属性发生变化时,View 会自动更新,反之亦然。 ### 2. 数据绑定 数据...

    knockoutjs-express-es6:示例,演示如何使用KnockoutJS,Express.js和ECMAScript 6以MVVM模式实现单页应用程序(SPA)

    KnockoutJS-Express-ES6 该示例演示了如何使用KnockoutJS,Express.js和ECMAScript 6以MVVM模式实现单页应用程序(SPA)。 主要特点 单页应用程序(SPA) ECMAScript 6(ES6)(带有BabelJS) 适用于MVVM的...

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

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

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

    10. **自定义绑定**:如果内置的数据绑定不满足需求,可以创建自定义绑定来扩展KnockoutJS的功能,使其能与特定的DOM元素或第三方库集成。 以上只是部分关键知识点,深入学习KnockoutJS,你需要理解并实践这些概念...

    knockoutjs-form

    在“knockoutjs-form”这个主题中,我们将深入探讨如何使用KnockoutJS来创建和管理表单,以及如何利用其特性来实现高效的数据绑定和验证。 **一、KnockoutJS基础** 1. **数据绑定**:KnockoutJS的核心特性之一就是...

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

    KnockoutJS是一款强大的JavaScript库,专门用于实现MVVM(Model-View-ViewModel)模式,它使得数据绑定和DOM更新变得更加简单。在KnockoutJS中,组件是构建复杂用户界面的重要工具,允许我们将UI拆分为可重用的部分...

    frontend-knockoutjs-address-book

    这些框架允许您将数据与 html 元素动态绑定。 用户故事 作为用户,我必须能够查看我的联系人列表,包括名字和姓氏以及电话号码。 作为用户,我必须能够添加一个包含他所有信息的新联系人。 作为用户,我必须能够...

    KnockoutJs 帮助文档 中文手册

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

    KnockoutJS-Nested-DataTable:KnockoutJS Nested DataTable 是一个 KnockoutJS 自定义组件,易于使用、自定义元素、嵌套表和可扩展。 所有默认的 dataTable 功能,如排序、分页、搜索等也适用于此组件

    KnockoutJS 嵌套数据表 KnockoutJS Nested DataTable是一个 KnockoutJS 自定义组件,易于使用、自定义元素、嵌套表和可扩展。 所有默认的 dataTable 功能,如排序、分页、搜索等,也适用于该组件。 当前版本 0.1.0 ...

    Asp.Net MVC 4 KnockoutJS 框架实例

    而KnockoutJS则是一个轻量级的JavaScript库,专门用于实现MVVM(Model-View-ViewModel)模式,它简化了DOM操作,使得前端数据绑定变得更加便捷。 在Asp.Net MVC 4中,模型(Model)负责业务逻辑和数据处理,视图...

    knockoutjs-doc-ja:KnockoutJS 非官方日语文档

    淘汰赛-doc-ja KnockoutJS 的非官方日语文档。 添加了对 Markdown 的支持。 文章文件为 docs/articles/*.md。 PULL REQ 如果你发送它,它会被反映!格式暂时以下的风格和原家是一致的,但是如果你写的不放心,我们会...

    knockoutjs-jsonSchema

    这使您可以轻松生成一个架构,该架构可用于在服务器端验证JSON数据(使用您选择的技术),同时使客户端和服务器上的模型定义和复制自动保持自动同步。基本用法基因敲除jsonSchema创建一个ko.jsonSchema对象。 要...

    KnockoutJS中文文档新

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

    KnockoutJS-brackets:支架的扩展Kong

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

Global site tag (gtag.js) - Google Analytics