很抱歉,这个问题主要是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文档确实说你可以停止绑定,但不包括一个例子如何或是否可以让你在需要时手动应用绑定。
之前是否有人能够部署此技术,维护viewModel来自服务器,并且之后不会创建,或者已经部署了具有相同结果的类似技术。
答案 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,直到您的数据加载为异步?