【问题标题】:Knockout JS foreach $root undefined淘汰赛 JS foreach $root 未定义
【发布时间】:2019-06-03 19:08:44
【问题描述】:

我正在尝试在 Knockout JS 中创建一个广播组,这是模板代码

<p>Selected Plan <div data-bind="text: selectedPlan"></div></p>
<div data-bind="foreach: plans">
    <label>
        <input type="radio" name="plan" data-bind="attr: {value: id}, checked: $root.selectedPlan"/>
        <span data-bind="html: title"></span>
        <div data-bind="text: desc"></div>
    </label>
</div>

在组件selectePlanplans注册如下

this.plans = ko.observableArray([/* array of plans */]);
this.selectedPlan = ko.observable('xxxxx');

我已验证xxxxxthis.plans 中的有效条目。尽管如此,控制台中还是会出现错误

knockout.js:3391 Uncaught TypeError: Unable to process binding “foreach: function(){return plans }”消息:无法处理 绑定“检查:函数(){return $root.selectedPlan}”消息: 无法读取未定义的属性“selectedPlan”

由于某种原因,$root 关键字似乎是 undefined...

编辑: 计划结构

[{
 id: 'xxxxx',
 desc: 'This is a great plan',
 title: '<strong>Save with great plan</strong>',
},
...
]

【问题讨论】:

  • this.plans = ko.observableArray([/* array of plans */]);plans的结构是什么?看来您根本不需要使用 $root ,因为您有 foreach ...它们只是字符串吗?
  • @Akrion 我不需要$root 来正确访问组件(并且知道当前选择),因此只选择正确的输入吗?顺便说一句 - 在问题中添加了 plans 的结构
  • @quickshiftin 请看一下我的回答,因为我认为它可能会解决您的问题,而不是作为已接受的解决方案提供的有效解决方法。

标签: knockout.js


【解决方案1】:

我知道这已经得到解答,但我想你仍然想知道为什么 $root 是未定义的(我会)。我可以看到您在这里和那里谈论“组件”。可能就像您只是尝试获取组件的根一样简单,因此$component

来自淘汰赛:

$组件

如果您处于特定组件模板的上下文中,那么 $component 指的是该组件的视图模型。这是 特定于组件的等效于 $root。在嵌套的情况下 components, $component 指的是最接近的视图模型 组件。

这很有用,例如,如果组件的模板包含一个或 您希望在其中引用某些属性的更多 foreach 块或 在组件视图模型上而不是在当前数据上运行 项目。

请查看Knockout Binding Context 页面了解更多信息。

【讨论】:

  • 感谢@Sam 的提交!我实际上已经从将我带到这个问题的任务中继续前进,所以我不确定我是否能够验证它(尽管投票!)
【解决方案2】:

看看这个例子:

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<p>Selected Plan
  <b><span data-bind="text: selectedPlan"></span></b>
</p>
<div data-bind="foreach: plans">
  <label>
    <input type="radio" name="plan" data-bind="value: title, checked: $parent.selectedPlan"/>
    <span data-bind="html: title"></span>
    <span data-bind="text: desc"></span>
  </label>
</div>

<script type="text/javascript">
  var viewModel = {
    plans: ko.observableArray([
      {id: 1, desc: 'Red Foo', title: 'Foo'}, 
      {id: 2, desc: 'Blue Bas', title: 'Bas'}
    ]),
    selectedPlan: ko.observable()
  };
  ko.applyBindings(viewModel);
</script>

我做了一些改变:

  1. 没有使用attr绑定,而是直接使用valuechecked
  2. 我使用$parent 来达到最高级别,但$root 也可以使用
  3. 我稍微更改了 html 以将其放在一行中,等等。

【讨论】:

  • 我在 codepen 上也有一个类似的工作示例,但在我的真实项目中 $rootundefined。试图弄清楚如何调试它,而不是打印出循环顶部的值......
  • $parent 呢?这说明什么?另外,当您选择元素并执行“ko.dataFor($0)”时,您会在开发工具中得到什么???
  • 切换到$parent 成功了。我还发现这个related thread 很有帮助。感谢您的帮助@Akrion!
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2013-08-14
  • 2013-11-09
  • 1970-01-01
  • 2016-08-13
相关资源
最近更新 更多