Javascript 解包属性后,敲除停止更新observable

Javascript 解包属性后,敲除停止更新observable,javascript,knockout.js,Javascript,Knockout.js,刚刚注意到knockout.js中出现了一些意想不到的行为—获得了一些代码,这些代码围绕observableArray循环,并为数组中的每个项重复一些绑定的HTML元素。其中一项是子对象上的属性: <tbody data-bind="foreach: Contact"> <tr> <td data-bind="text: Name"></td> <td data-bind="text: Project(

刚刚注意到knockout.js中出现了一些意想不到的行为—获得了一些代码,这些代码围绕observableArray循环,并为数组中的每个项重复一些绑定的HTML元素。其中一项是子对象上的属性:

<tbody data-bind="foreach: Contact">
    <tr>
        <td data-bind="text: Name"></td>
        <td data-bind="text: Project().Name"></td>
        <td data-bind="text: Percentage"></td>
    </tr>
</tbody>
<tbody data-bind="foreach: Contact">
    <tr>
        <td data-bind="text: Name"></td>
        <td></td>
        <td data-bind="text: Percentage"></td>
    </tr>
</tbody>

这在页面加载时呈现良好效果。但是,如果用户执行的操作最终更改了联系人数组或其中的项,则Name和Project()会更新。Name和Project()会更新,但百分比不会更新,即使单步执行显示其值正确

但是,如果删除未打包的子对象:

<tbody data-bind="foreach: Contact">
    <tr>
        <td data-bind="text: Name"></td>
        <td data-bind="text: Project().Name"></td>
        <td data-bind="text: Percentage"></td>
    </tr>
</tbody>
<tbody data-bind="foreach: Contact">
    <tr>
        <td data-bind="text: Name"></td>
        <td></td>
        <td data-bind="text: Percentage"></td>
    </tr>
</tbody>

一切都很完美

这里发生了什么,有没有比使用计算的可观察对象或类似的东西来计算和保存我的项目()名称值更好的修复方法?

试试这个

<td data-bind="text: ko.computed(function() { return Project().Name() })"></td>


如果需要双向绑定,出于好奇,可以使用可写计算

,重新排序是否会影响问题?i、 e.如果Project().name最后一次呈现,这是否允许呈现百分比?您可以在JSFIDLE中重现它吗?另外,
等。可能应该是
-Joseph-是的,如果Project()可以正常工作。名称排在最后。。。sroes——我会尝试把一些东西放在一起,但是我们有一个复杂的应用程序,我不能总是用简单的JSFIDLE近似来重现问题。我也非常有兴趣在JSFIDLE中看到重新编程。这听起来像是一个可能的bug或明确的“gotcha”,很容易理解。另外,我假设
数据绑定
属性实际上使用的是
文本:
您真的应该试着重新编写它。。。否则,几乎不可能告诉你出了什么问题。但是,您应该尝试创建一个如上所述的计算表达式,或者将表达式重写为: