Knockout if-binding的原因在更新时不起作用

时间:2013-01-19 23:57:17

标签: knockout.js signalr

我整天都在努力解决一个让我疯狂的问题。似乎淘汰'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%的时间内工作,这表明了时间/线程问题。控制台中没有记录任何类型的警告。

有人能指出我正确的方向吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

绅士,谢谢你的帮助!经过一夜安眠,你们告诉我这个应该工作,我发现了问题。

我的装订酱实际上看起来更像是这样:

myNS.bindUserTemplate = function(context){
  $('.js-user-template').each(function(){
      ko.applyBindings(userViewModel, this);
  });
}

myNS.DomUpdated(myNS.bindUserTemplate);.

或者自己的小框架允许我每次在DOM中更新某些内容时绑定到自定义事件。这样我就可以解析它并查看它是否包含模板。我的问题是我忘了在更新的元素的上下文中选择.js-user-template类。这导致模板被绑定4次,而不是一次....

很抱歉浪费你的时间,希望这个问题仍能帮助那些遇到同样问题的人。