【问题标题】:Hot Towel - Knockout binding not updating observablearray热毛巾 - 淘汰赛绑定不更新 observablearray
【发布时间】:2013-05-17 15:28:21
【问题描述】:

我正在使用热毛巾模板创建一个 SPA 项目。 我有一个显示项目列表的列表视图,当单击一个项目时,它将转到详细视图。

router.mapRoute('details/:module/:id', 'viewmodels/details', 'Details', false);

详情页面的 URL 变为:

https://xxx/test/#/details/news/4

我的详细信息屏幕包含一个可观察数组,该数组在 details.js 激活方法上使用 AJAX 填充。

<button class="btn btn-info"
    data-bind="click: save">
    <i class="icon-save"></i>Save</button>

<form id="myform" data-bind="submit: submitForm">
    <table>
        <tbody data-bind="foreach: screenDataArray">
            <tr>
                <td data-bind="text: FieldLabel"></td>
                <td>
                    <input data-bind="value: FieldValue" />
                </td>
            </tr>
        </tbody>
    </table>
</form>

FieldLable 和 FieldValue 显示没有问题,假设这意味着数据绑定确实正确。

我更改了 FieldValue,当我点击保存按钮时:

var save = function () {
  ko.utils.arrayForEach(screenDataArray(), function (sd) { alert(sd.FieldName + ":" + sd.FieldValue); });

我的问题是 FieldValue 仍然包含原始值(未更新)。

现在我点击浏览器刷新按钮。

我更改值并点击保存。

现在保存功能会提醒正确的更改值。

我会假设代码链完全相同,但我不明白为什么从列表视图重定向时它不起作用,但刷新会突然起作用。

提前感谢您的帮助。

【问题讨论】:

    标签: knockout.js durandal hottowel ko.observablearray


    【解决方案1】:

    来自您发布的代码 sn-p:

    var save = function () {
      ko.utils.arrayForEach(screenDataArray(), function (sd) { alert(sd.FieldName + ":" + sd.FieldValue); });
    

    看起来 FieldValue 本身不是可观察的(您的代码需要它才能工作)。 observableArrays 将侦听诸如添加和删除元素之类的更改(在 observableArray 本身上调用的方法),但它们并不真正知道其中一个元素何时更改。通过成为可观察对象,这取决于元素本身。

    【讨论】:

    • 感谢您的回复,但它没有解释为什么当我刷新屏幕(即直接进入详细信息视图而不是通过列表视图)时,它正确捕获了屏幕上的值。
    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多