Knockout.js:observable的初始值不会更新RadioButton状态

时间:2017-12-14 08:39:24

标签: javascript knockout.js

这是一个非常简单的故事,我无法使其发挥作用:

我们有一个questions数组。每个问题都有一个answer数组。每个答案都有textvalue。每个question都有selectedAnswer属性,代表所选答案的value

这是jsfiddle:https://jsfiddle.net/votsevfd/8/

实施

<div data-bind="foreach : {data: questions}">

Question: <span data-bind="text: descr"></span>
<div data-bind="foreach: {data: answers}">
  <div>    
    <label data-bind="text: text"></label>
    <input name="something" type="radio" data-bind="checked: $parent.selectedAnswer, value: value"></input>    
  </div>
</div>
<div>
The selected answer is:<span data-bind="text: selectedAnswer"></span>
</div>
</div>

以下是相关的JavaScript

 var model = {
  questions: ko.observableArray(),
  };

var q1 = {
  descr: 'Do you like JS?',
  selectedAnswer: ko.observable('200'), // Initially, select No (200)
  answers: [
    {text:'Yes', value:'100'},
    {text:'No', value:'200'}
  ],
}
model.questions.push(q1);

ko.applyBindings(model);

问题: 我想根据selectedAnswer的初始值(在上面的例子中,单选按钮No)选择适当的单选按钮。但它不起作用。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

这是一个奇怪的问题。我能够通过改变value<input name="something" type="radio" data-bind="value: value, checked: $parent.selectedAnswer" /> 绑定的顺序来修复它:

foreach

Updated fiddle

还有另一个解决方法。如果你切换到淘汰赛的最新版本,这个问题就会消失。所以,我假设他们在版本2和3.0之间修复了它。

Updated fiddle

(另外,您可以简化data-bind="foreach : questions"对此的绑定:onEnterPress = (e) => { if(e.keyCode == 13 && e.shiftKey == false) { e.preventDefault(); this.myFormRef.submit(); } } render() { return ( <form ref={el => this.myFormRef = el} className=""> <textarea type="text" rows="3" name="body" onKeyDown={this.onEnterPress} /> <button className="btn" type="submit"> Comment </button> </form> ); }

<强>更新

这确实是一个错误。您可以浏览@ user3297291&#39; detailed answer以获取有关此内容的更多信息。