【问题标题】:knockout.js id handling bug?knockout.js id 处理错误?
【发布时间】:2012-08-30 02:15:18
【问题描述】:

我想知道你们中是否有人遇到过以下问题,也许知道解决方法。

如果我在 ko 模板中有一个 'foreach' 迭代并尝试使用 'with' 上下文修饰符,如果 'with' 尝试,ko 将无法处理迭代的第一项(是的,只有第一项)绑定到一个名为“id”的属性。

示例:http://jsfiddle.net/rG5Xw/8/

如果你运行它,它不会显示第一项,但如果你将内部虚拟元素的'with'语句更改为'name',它就会按预期工作。很烦人...:S

有人知道如何解决这个问题吗?

提前致谢!

【问题讨论】:

  • 一个更简单的例子表明问题是因为 ko 处理零很奇怪,并且每当您尝试创建一个包含单个零数字的属性的“with”上下文更改时,它都会失败: [link]jsfiddle.net/rG5Xw/9如果将视图模型的“item”属性的值更改为零,则不会在“with”语句的范围内呈现任何内容...
  • 不知道你在说什么......你的小提琴工作正常,显示所有 3 个项目,没有什么叫做“id”。如果我将“名称”更改为“id”,它仍然是works fine。你的第二把小提琴也一样
  • @antishok : "如果将视图模型的 'item' 属性的值更改为零,则不会在 'with' 语句的范围内呈现任何内容"

标签: knockout.js


【解决方案1】:

with 用于对象。所以它对真实性进行了简单的检查,认为零是错误的。您可以通过将数字转换为字符串来解决此问题:http://jsfiddle.net/rG5Xw/11/

编辑:这是基于我的 withlightwith 的替代品,它不对值进行任何检查(例如:http://jsfiddle.net/mbest/rG5Xw/12/):

ko.bindingHandlers['mywith'] = {
    'init': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var bindingValue = ko.utils.unwrapObservable(valueAccessor());
        var innerContext = bindingContext['createChildContext'](bindingValue);
        ko.applyBindingsToDescendants(innerContext, element);
        return { 'controlsDescendantBindings': true };
    }
};
ko.virtualElements.allowedBindings.mywith = true;

【讨论】:

  • 感谢您的回答。我知道它适用于字符串以及任何其他数据,包括数字。当然除了零。我看不到检查“真实性”而不是检查值是否未定义的意义。我也不明白为什么尽管包装了 html 元素,但没有渲染任何内容。它根本不应该迭代,或者应该,但随后将数据处理为空,而不是整个内容。它还应该处理任何数据,绝对为零,但也可以处理未定义等。
  • 我添加了一个自定义绑定,您可能会发现它对您的情况有用。
  • 使用自定义绑定代替 with 绑定确实是个好主意 - 效果很好,谢谢 :)
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2016-09-27
  • 2018-08-30
  • 1970-01-01
  • 2014-07-09
相关资源
最近更新 更多