KnockoutJS:向映射生成的ObservableArray中的对象添加Observable属性和函数

And*_*rew 17 knockout-mapping-plugin knockout.js

我是KnockoutJS的新手,我不得不尝试ko.observableArray()mapping插件创建的生成对象中添加其他属性和方法.


这是我要去的地方:

  • 我有一个JSON数组 Users
  • ko.observableArray()用映射插件创建了它
  • 我有一个模板,为每个创建表行User,到目前为止很好:o)


这是我正在尝试做的事情:

每个User都有一个名为的属性'IsActive'- 我想data-bind在每个User对象上切换此'IsActive'属性的方法的click事件.

这个问题看起来很有希望,但是我必须在JS中声明整个View模型似乎是不必要的重复(除非我必须这样做!) - 是否可以只扩展生成的对象?

我正在考虑这些方面,其中有一种方法可以声明其他属性或方法,并让它们扩展mapping生成的对象,但本文关注的是单个对象,而不是在生成的数组中扩展对象.


这是代码: http ://jsfiddle.net/yZkSf/2/ (尚未在JS小提琴中工作 - 但我将继续使用它并在我开始工作时更新此链接).

谢谢您的帮助

RP *_*yer 13

您可以考虑几种选择.

- 一个是使用create回调来控制如何创建"用户"对象.您可以自己定义observable并添加额外的功能,也可以在单个用户对象上调用映射插件,然后添加额外的功能.

将是这样的:http://jsfiddle.net/rniemeyer/fkVaK/

- 否则,您可以在viewModel上放置"toggle"函数,然后将"user"对象传递给它.

1.3的一个好方法是使用ko.dataFor类似jQuery的live/delegate/on事件委托功能.就像:http://jsfiddle.net/rniemeyer/FkjNr/

//unobtrusive event handler
$(".toggle").live("click", function() {
    var user = ko.dataFor(this);
    if (user) {
       viewModel.toggleIsActive(user);
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您不想使用事件委派,则可以使用匿名函数直接传递项目,如:http://jsfiddle.net/rniemeyer/GpQtN/

编辑:从2.0开始,当使用点击/事件绑定时,当前数据会自动传递给处理程序,因此您可以这样做:

<a href="#" data-bind="click: $root.toggleIsActive"><span data-bind="text: IsActive"></span></a>
Run Code Online (Sandbox Code Playgroud)