我整天都在努力解决一个让我疯狂的问题。似乎淘汰'if'语句的内容在其值更新时不会被重新评估。
我有一个像这样的viewModel:
var userViewModel = (function(){
var context = ko.observable(),
// SignalR hub
hub = $.connection.user;
hub.client.setContext = function(data){
context(ko.mapping.fromJS(data));
}
return {
context: context;
};
})();
它使用SignalR更新客户端中的viewModel,启动时尚不存在。
我正在使用ko绑定,因此在应用绑定时视图不会分解。视图看起来像这样:
<div class="js-user-template">
<!-- ko if: context -->
<div data-bind="with: context">
<span data-bind="text: firstName"></span>
<span data-bind="text: lastName"></span>
</div>
<!-- /ko -->
</div>
将它结合在一起的装订酱:
$('.js-user-template').each(function(){
ko.applyBindings(userViewModel, this);
});
当SignalR使用setContext异步更新客户端时,它不会在DOM中更新。奇怪的是,它确实在大约10%的时间内工作,这表明了时间/线程问题。控制台中没有记录任何类型的警告。
有人能指出我正确的方向吗?任何帮助将不胜感激。
答案 0 :(得分:0)
绅士,谢谢你的帮助!经过一夜安眠,你们告诉我这个应该工作,我发现了问题。
我的装订酱实际上看起来更像是这样:
myNS.bindUserTemplate = function(context){
$('.js-user-template').each(function(){
ko.applyBindings(userViewModel, this);
});
}
myNS.DomUpdated(myNS.bindUserTemplate);.
或者自己的小框架允许我每次在DOM中更新某些内容时绑定到自定义事件。这样我就可以解析它并查看它是否包含模板。我的问题是我忘了在更新的元素的上下文中选择.js-user-template类。这导致模板被绑定4次,而不是一次....
很抱歉浪费你的时间,希望这个问题仍能帮助那些遇到同样问题的人。