我正在使用KnockoutJS,遇到一个我不知道如何找到解决方案的问题:
我有一个包含记录的表:
<script type="text/html" id="myItemsTemplate">
<tr>
<td data-bind="text: MyNumber().toFixed(2)"></td>
<td>
<button class="btn" data-bind="click: $root.editItem">Edit</button></td>
<td>
<button class="btn btn-primary" data-bind="click: $root.enterHours">Enter Hours</button></td>
</tr>
最初,“ MyNumber()。toFixed(2)”只是“ MyNumber”,但我遇到了一个问题,其中“ MyNumber”不显示小数位,或者根据值显示多于2个小数位(如果值是“ 7.00”,则只会显示“ 7”,如果是“ 7.345345”,则会显示完整的“ 7.345345”)。所以我将其更改为“ MyNumber()。toFixed(2)”。
这似乎固定了显示,但是现在看来已经破坏了更新部分:
<script type="text/html" id="myEditTemplate">
<tr>
<td>
<input data-bind="value: MyNumber" class="table-edit" /></td>
<td>
<button class="btn btn-success" data-bind="click: $root.acceptItemEdit">Save</button></td>
<td>
<button class="btn btn-warning" data-bind="click: $root.cancelItemEdit">Cancel</button></td>
</tr>
</script>
在这里,当我尝试保存记录时,它将保存它,但也会返回错误:
错误:无法解析绑定。
消息:TypeError:对象不支持属性或方法“ toFixed”;
绑定值:文本:MyNumber()。toFixed(2)
我尝试过更改编辑模板,因此它使用:
ko.utils.unwrapObservable(MyNumber())。toFixed(2)
要么
MyNumber()。toFixed(2)以匹配项模板。这不会导致Javascript错误,但不会更新该值。
我看到过一些帖子说这是因为“ MyNumber”不是可观察的,所以我尝试了unwrapObservable()。除此之外,我不确定应该在哪里找出错误所在。
最佳答案
按照您的问题描述,我在此处复制了一个测试用例:http://jsfiddle.net/w2nae2dq/。
@icktoofay在某种程度上是正确的:最好使用计算得出的可观察值(但本身不是必需的)。如果需要显示两位十进制值来进行编辑,则需要可写的可计算观察值。但是,如果您只想显示十进制数字2并使MyNumber
值可编辑,请检查小提琴以获取演示。
无论如何,代码的问题是类型转换之一。确实,当您第一次设置MyNumber
的值时,它是一个数字。但是,当用户在<input>
中输入新值(并因此更新MyNumber
)时,该值将设置为字符串值,这使得text:
绑定无法在以下位置执行toFixed
方法。因此,您计算出的可观察值将如下所示:
self.MyNumberRounded = ko.computed(function() {
return parseFloat(self.MyNumber()).toFixed(2); // note parseFloat
}, self);
这就是为什么
Object doesn't support property
:)关于javascript - KnockoutJS对象不支持“toFixed”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27642386/