【问题标题】:Durandal / Knockout - Creating viewModel from server data prior to bindingsDurandal / Knockout - 在绑定之前从服务器数据创建 viewModel
【发布时间】:2014-11-03 14:16:04
【问题描述】:

很抱歉,这个问题主要是 Knockout,但在 Durandal 中,所以 ko anwser 的贡献者看起来并不熟悉 viewModel 和一些绑定。

基本上,我的视图由一个呈现服务器数据的表组成:

view.html

<table class="table">
    <tr>
        <td>Company</td>
        <td data-bind="text: Company"></td>
    </tr>
    <tr>
        <td>First Name</td>
        <td data-bind="text: FirstName"></td>
    </tr>
    <tr>
        <td>Last Name</td>
        <td data-bind="text: LastName"></td>
    </tr>
</table>

我在ASP.net 所以当然我使用signalR 来获取代表表中每个值的服务器数据。这是一个异步调用,因此它不会阻塞将执行 Knockout 绑定的 Durandal Composition 回调。

viewModel.js

define(['services/logger', 'global/session', 'jquery', 'knockout', 'knockout-mapping', 'hubs'],

function ($, ko, komapping) {
    ko.mapping = komapping; // Needed
    var myChildModel = function (Id) {
        this.activate = function () {
            $.connection.hub.start().done(function () {
                con.server.getDetails(Id).done(function (data) {
                    ko.mapping.fromJS(data, {}, this);
                    console.log(data);
                });
            });
        };
    };
    return myChildModel;
});

真的想要获取服务器返回并将其映射到 viewModel 本身,如上所示,因为我可以自动考虑服务器端数据的变化(不包括或相关的这一点),但由于在 binding 回调之前 viewModel 不存在

导致预期的错误:

无法处理绑定“文本:函数(){return Company}” 消息:公司未定义;查看:小部件/客户信息;模块编号: 小部件/客户信息

为了解决这个问题,我想停止 Knockout applyBindings,然后在我的服务器上手动调用它返回 .done 回调。

Durandal 文档确实说您可以停止绑定,但没有包含如何或是否可以在需要时手动应用绑定的示例。

Durandal Docs

之前有没有人能够部署这种技术,维护 viewModel 来自服务器,而不是创建然后水合,或者已经部署了具有相同结果的类似技术。

【问题讨论】:

    标签: javascript knockout.js durandal


    【解决方案1】:

    这似乎是一个微不足道的问题,但为什么不在它上面添加一个条件 if 呢?

    <table class="table" data-bind="if: isLoaded">
        <tr>
            <td>Company</td>
            <td data-bind="text: Company"></td>
        </tr>
        <tr>
            <td>First Name</td>
            <td data-bind="text: FirstName"></td>
        </tr>
        <tr>
            <td>Last Name</td>
            <td data-bind="text: LastName"></td>
        </tr>
    </table>
    

    然后将 isLoaded 设置为 false,直到您的数据异步加载?

    【讨论】:

    • 哇,有时我们会采取最简单的方法,而只是想它们。这正是我应该做的和已经做过的。非常感谢 PW Kad,感谢您对 Durandal 和 Knockout 社区的回答和您的 contributions。像你这样的人让像我这样的人不会发疯,真正帮助我们进一步了解知识。
    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2018-03-01
    • 2023-04-11
    • 2014-12-31
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多