Durandal / Knockout - 在绑定之前从服务器数据创建viewModel

时间:2014-09-10 03:22:52

标签: javascript knockout.js durandal

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

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

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本身,如上所示,然后我可以自动考虑服务器端数据的变化(不包括在内或与之相关)这一点),但由于viewModel在binding回调之前不存在

导致预期的错误:

  

无法处理绑定“text:function(){return Company}”   消息:公司未定义;查看:小部件/ customerInfo;的moduleId:   窗口小部件通过/ customerinfo

要否定此问题,我想停止Knockout applyBindings,然后在我的服务器上手动调用它.done回拨。

Durandal文档确实说你可以停止绑定,但不包括一个例子如何或是否可以让你在需要时手动应用绑定。

Durandal Docs

之前是否有人能够部署此技术,维护viewModel来自服务器,并且之后不会创建,或者已经部署了具有相同结果的类似技术。

1 个答案:

答案 0 :(得分:2)

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

<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,直到您的数据加载为异步?