0

私は正気を失っている問題に一日中取り組んでいます。値が更新されたときにノックアウト 'if' ステートメントの内容が再評価されないようです。

私は次のようなビューモデルを持っています:

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% の確率で動作します。コンソールには、いかなる種類の警告も記録されません。

誰かが私を正しい方向に向けることができますか? どんな助けでも大歓迎です。

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 クラスを選択するのを忘れていたことです。これにより、テンプレートが 1 回ではなく 4 回バインドされました。

時間を無駄にして申し訳ありませんが、この質問が同じ種類の問題を抱えている人に役立つことを願っています.

于 2013-01-29T10:56:03.640 に答える