让我们考虑使用类似的淘汰视图模型:
var data = [{ id: 1,name: "John Doe" },{ id: 2,name: ""},{ id: 3,name: "Peter Parker"}];

var viewmodel = {
    items: ko.observableArray(data)
};

viewmodel.showName = function (name) {
    console.log(this);
    return name && name.length > 0;
};

viewmodel.removePerson = function () {
    console.log(this); 
};

ko.applyBindings(viewmodel);

有了这个视图:

<ul data-bind="foreach: items">
    <li><span data-bind="text: id"></span>
         <span data-bind="visible: $root.showName(name)">Yes! show the name</span>
         <a href="#" data-bind="click: $root.removePerson">Remove</a>
    </li>
</ul>

你可以在这里看到它:http://jsfiddle.net/SmW35/8/

在这种情况下,当有人点击“删除”链接,并且KO调用showName函数时,
函数内部的对象“this”,它是当前项目的对象,例如,如果我单击项目2中的“remove”,则“this”为{id:2,name:“”}
但是,当KO绑定“visible”并调用showName函数时,“this”对象不包含当前项,并且您必须将“name”传递给该函数(或者您可以使用$data).

所以,我有两个问题:

>有一种方法可以从View调用showName函数,而不传递名称或$data(与Remove链接相似的行为)
>如果没有,这样做有什么不对吗?我与一个认为不正确的同事进行了一次有趣的讨论,因为你是从View($root.showName(name))发送数据,然后这不是一个“纯粹的”MVVM模式.他建议创建一个自定义KO绑定来实现功能.在我看来是用坦克杀死苍蝇,但我很想知道是否有不同的方式,或者你也认为我没有用我的代码做一个纯粹的MVVM模式.

解决方法

从某种意义上说,你的同事有一个观点.我不会亲自创建一个自定义绑定来处理这个问题(在一个持续的主观说明中,如果在视图和视图模型之间存在特殊的通信方式,则更有意图使用自定义绑定;有关何时使用它们的详细说明,请参阅 this post ).

另外,如果我们探索自定义绑定的选项,我想你可以做一些像textIfNotEmpty绑定处理程序,它将文本和可见结合在一起.另一方面,如果showName功能保持简单,您也可以选择:

<span data-bind="visible: !!name,text: name"></span>

无论如何,我更喜欢以下……

根本问题是IMO视图模型违反了单一责任原则:showName功能应该是表示项目的视图模型的责任.

var Item = function(data) {
    var self = this;

    self.id = data.id;

    self.name = ko.observable(data.name); 
    // or plain "self.name = data.name;" if you don't need 2way binding

    self.showName = ko.computed(function() { 
         return self.name() && self.name().length > 0;
    });
}

现在你可以像这样轻松绑定:

<ul data-bind="foreach: items">
    <li><span data-bind="text: id"></span>
         <span data-bind="visible: showName">Yes! show the name</span>
         <a href="#" data-bind="click: $root.removePerson">Remove</a>
    </li>
</ul>

这也允许您将removePerson重写为:

viewmodel.removePerson = function (person) {
    console.log(person); 
};

这确实需要你在构造可观察数组时做一些额外的工作,但它值得,因为它清楚地分离了所有关注点.它可以按照以下方式完成:

var viewmodel = {
    items: ko.observableArray(data.map(function(item) { return new Item(item); }))
};

有关上述演示,请参阅this fiddle.

javascript – Knockout JS在foreach绑定中调用ViewModel函数的更多相关文章

  1. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. canvas中普通动效与粒子动效的实现代码示例

    canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。本文详细的介绍了粒子特效,和普通动效进行对比,非常具有实用价值,需要的朋友可以参考下

  3. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. canvas学习和滤镜实现代码

    这篇文章主要介绍了canvas学习和滤镜实现代码,利用 canvas,前端人员可以很轻松地、进行图像处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. localStorage的过期时间设置的方法详解

    这篇文章主要介绍了localStorage的过期时间设置的方法详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. 详解HTML5 data-* 自定义属性

    这篇文章主要介绍了详解HTML5 data-* 自定义属性的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. HTML5适合的情人节礼物有纪念日期功能

    这篇文章主要介绍了HTML5适合的情人节礼物有纪念日期功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部