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

knockoutjs foreach array绑定 表格 下拉框绑定

 
阅读更多
动态表格使用observable arrays and the foreach
ko.observableArray: 观察者模式,根据array动态更新表格

ko中的流程控制标签:foreach, if, ifnot, and with
在foreach的数据源发生变化时,ko并不会重新生成整个table, 更高效地,ko会找到viewmodel中变化的部分, 然后更新数据变化对应的最小DOM集合。

data-bind="foreach: seats":foreach表格循环
meal().price: meal属性是一个被观察对象,在尝试取得子属性之前要使用meal()函数,即注意是meal().price, 不是 meal.price

data-bind="click: addSeat, enable: seats().length < 5":表示按钮绑定到click事件addSeat,并且按钮只在表格数据小于5时可用,删错或者增加表格数据,由于ko的自动依赖追踪机制,按钮的可用状态会自动变化。

data-bind="visible: totalSurcharge() > 0":用来控制控件是否显示,对应css的display 属性

$root.前缀代表Knockout去viewmodel的顶层查询相应属性,而不是绑定表格seats数组中的实例变量SeatReservation中查询。

必须是引用方法的形式(带括号)引用observable变量,这与ko的自动依赖追踪相对象(如果是属性的话,就仅仅引用变量的值,做不到其他效果)

// 下拉框绑定到$root.availableMeals数组,下拉框显示的文字内容由optionsText: 'mealName'决定,下拉框的值绑定到seats数组中对象SeatReservation的meal属性!
<select data-bind="options: $root.availableMeals, value: meal, optionsText: 'mealName'"></select>


viewmodel(控制器)
// Class to represent a row in the seat reservations grid
function SeatReservation(name, initialMeal) {
    var self = this;
    self.name = name;
    self.meal = ko.observable(initialMeal);
    
    self.formattedPrice = ko.computed(function() {
        var price = self.meal().price;
        return price ? "$" + price.toFixed(2) : "None";        
    });
}

// Overall viewmodel for this screen, along with initial state
function ReservationsViewModel() {
    var self = this;

    // Non-editable catalog data - would come from the server
    self.availableMeals = [
        { mealName: "Standard (sandwich)", price: 0 },
        { mealName: "Premium (lobster)", price: 34.95 },
        { mealName: "Ultimate (whole zebra)", price: 290 }
    ];    

    // Editable data
    self.seats = ko.observableArray([
        new SeatReservation("Steve", self.availableMeals[0]),
        new SeatReservation("Bert", self.availableMeals[0])
    ]);
    
    // Operations
    self.addSeat = function() {
        self.seats.push(new SeatReservation("", self.availableMeals[0]));
    }
    self.removeSeat = function(seat) { self.seats.remove(seat) }
    
    self.totalSurcharge = ko.computed(function() {
       var total = 0;
       for (var i = 0; i < self.seats().length; i++)
           total += self.seats()[i].meal().price;
       return total;
    });
}

ko.applyBindings(new ReservationsViewModel());

view视图
<h2>Your seat reservations</h2>

<table>
    <thead><tr>
        <th>Passenger name</th><th>Meal</th><th>Surcharge</th><th></th>
    </tr></thead>
    <!-- Todo: Generate table body -->
    <tbody data-bind="foreach: seats">
        <tr>
            <td><input data-bind="value: name" /></td>
            <td><select data-bind="options: $root.availableMeals, value: meal, optionsText: 'mealName'"></select></td>
            <td data-bind="text: meal().price"></td>
            <td data-bind="text: formattedPrice"></td>
            <td><a href="#" data-bind="click: $root.removeSeat">Remove</a></td>
        </tr>    
    </tbody>
</table>
<h3 data-bind="visible: totalSurcharge() > 0">
    Total surcharge: $<span data-bind="text: totalSurcharge().toFixed(2)"></span>
</h3>
<h2>Your seat reservations (<span data-bind="text: seats().length"></span>)</h2>

<button data-bind="click: addSeat, enable: seats().length < 5">Reserve another seat</button>
分享到:
评论

相关推荐

    KnockoutJS 3.X API 第四章之数据控制流foreach绑定

    为了使用 KnockoutJS 的 foreach 绑定,首先需要通过 &lt;script&gt; 标签引入 KnockoutJS 的库,然后使用 ko.applyBindings 函数来将 KnockoutJS 的绑定应用于页面的特定部分。 总的来说,KnockoutJS 的 foreach 绑定...

    ko knockoutjs动态属性绑定技巧应用

    总结来说,动态属性绑定技巧在Knockout.js中的应用,主要涉及扩展knockout的核心功能,以便根据运行时的需求动态地添加和绑定属性。这一技巧对于构建高度动态和可扩展的Web应用程序至关重要,能够帮助开发者更好地...

    knockoutjs2.0入门.docx

    例如,如果你有一个包含多个项目的数组`myItems`,你可以使用`foreach`绑定将数组中的每个元素渲染为表格行(TR)。每当`myItems`数组发生改变,如添加或删除项目,KnockoutJS会自动更新表格。你不再需要手动添加或...

    KnockoutJS

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

    KOBindings:KnockoutJS的自定义绑定通常对使用SharePoint很有用

    不幸的是,在使用KnockoutJS的第一年左右,我收集了很多这样的东西,而没有维护源位置。 如果您在这里看到自己的作品,请告诉我,我会给你功劳! / src每个bindingHandler包含一个文件 / html包含示例文件,这些...

    KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定

    在KnockoutJS 3.X API中,foreach绑定与if绑定结合使用,可以实现更复杂的条件渲染。示例中展示了如何遍历planets数组,并针对每个planet,如果其capital属性不为null,则显示该capital的细节信息。 除了基本的if...

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

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

    KnockoutJs 帮助文档 中文手册

    KnockoutJS的核心特性就是双向数据绑定。这意味着当模型中的数据发生变化时,视图会自动更新;同样,当用户在界面上进行交互改变视图时,模型也会同步更新。这种绑定可以通过简单的语法如`data-bind`实现,例如`...

    KnockoutJS中文文档新

    数据绑定是KnockoutJS的核心特性。它允许开发者用声明式的方式将JavaScript对象的属性与HTML元素关联起来。常见的数据绑定类型包括文本绑定、HTML绑定、事件绑定、条件绑定、循环绑定等。例如,`...

    基于knockoutjs的分页脚本

    这可以通过KnockoutJS的`foreach`绑定实现: ```html &lt;ul data-bind="foreach: { data: pages(), as: 'page' }"&gt; &lt;li&gt;&lt;a href="#" data-bind="text: page, click: function() { currentPage(page); }"&gt;&lt;/a&gt;&lt;/li&gt; ...

    BootstrapTable+KnockoutJS相结合实现增删改查解决方案(三)两个Viewmodel搞定增删改查

    通过引入这些库文件,页面能够获得丰富的表格操作功能,以及KnockoutJS的数据绑定和自动更新能力。 博主还演示了如何利用knockout.mapping插件来将后端返回的JSON数据序列化并绑定到页面元素上。该插件能够将JSON...

    KnockoutJs_帮助文档_中文手册 chm

    数据绑定是KnockoutJS的主要功能,它允许开发者声明性地将UI元素与JavaScript对象的属性关联起来。KnockoutJS支持多种类型的绑定,如文本绑定、HTML绑定、事件绑定、条件绑定、循环绑定等,使得UI的更新自动化,...

    Asp.Net MVC 4 KnockoutJS 框架实例

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

    WebApi+Bootstrap+KnockoutJs打造单页面程序

    接下来,在具体实现中,结合KnockoutJs进行数据绑定和视图模型的定义,使用Bootstrap框架来美化界面,最终实现一个完整的单页面应用程序。开发者可以利用KnockoutJs的依赖项跟踪特性来更新DOM,并且可以使用...

    KnockoutJS 3.X API 第四章之事件event绑定

    KnockoutJS是一个轻量级的MVVM(Model-View-ViewModel)库,它使得数据绑定和DOM操作变得更加简单。在KnockoutJS 3.X版本中,事件绑定(event binding)是其核心功能之一,允许开发者在用户与页面交互时调用特定的...

    KnockoutJS 3.X API 第四章之click绑定

    在KnockoutJS框架中,click绑定是用来响应DOM元素点击事件的一种机制,它允许开发者在用户与界面交互时执行JavaScript函数。KnockoutJS是一个轻量级的JavaScript库,用于构建可扩展的富数据应用程序。本文将详细介绍...

    KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定

    textInput绑定目的 textInput绑定主要用于&lt;input&gt;或者&lt;textarea&gt;元素。他提供了DOM和viewmodel的双向更新。不同于value绑定,textinput绑定是实时更新的。 例如: 源码: &lt;p&gt;Login name: &lt;input ...

    js knockoutjs 全国省市区三级联动

    接下来,我们需要在 ViewModel 中定义这些数据,并使用 KnockoutJS 的 observable 和 observableArray 来实现数据绑定。Observable 可以监听数据的变化,当数据改变时,与之绑定的视图会自动更新。 ```javascript ...

    KnockoutJS by Example源码

    1. **数据绑定**:KnockoutJS的核心在于其强大的数据绑定功能,允许开发者将DOM元素与JavaScript对象的数据属性直接关联。源码中会展示如何使用`text`, `html`, `value`, `if`, `foreach`等不同的数据绑定指令来动态...

Global site tag (gtag.js) - Google Analytics