0

我整天都在解决一个让我发疯的问题。似乎在更新其值时不会重新评估淘汰赛“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 更新客户端中的视图模型,该视图模型在启动时尚不存在。

我正在使用 ko if 绑定,因此在应用绑定时视图不会崩溃。视图如下所示:

<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% 的时间内工作,这表明存在时间/线程问题。控制台中不会记录任何类型的警告。

谁能指出我正确的方向?任何帮助都感激不尽。

4

1 回答 1

0

大佬,谢谢你的帮助!经过一夜好眠,你们告诉我这应该可以工作,我发现了问题。

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

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

myNS.DomUpdated(myNS.bindUserTemplate);.

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

很抱歉浪费您的时间,希望这个问题仍然可以帮助有同样问题的人。

于 2013-01-29T10:56:03.640 回答