2013-01-19 32 views
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更新視圖模型在客戶端,它並不存在於在啓動。

如果綁定,我使用ko,因此視圖在應用綁定時不會失效。視圖lookes這樣的:

<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

也許你可以在jsFiddle中使用類似setTimeout/setInterval而不是中心代碼的東西來重現此問題?看起來沒問題。你實際上並不需要額外的'if',因爲'with'已經正確處理null/undefined。 –

+0

爲什麼ApplyBindings在每個循環中? – BeaverProj

+0

我試圖讓這個jsfiddle並拿出信號和映射插件。似乎爲我工作http://jsfiddle.net/drdamour/L9FAa/ –

回答

0

紳士,謝謝你的幫助!經過一個良好的夜間睡眠,你們告訴我,這應該工作,我發現這個問題。

我結合實際醬看起來更象是這樣的:

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

myNS.DomUpdated(myNS.bindUserTemplate);. 

或者自己的小框架,讓我綁定到一個自定義事件每次的東西是在DOM更新。這樣我可以解析它,看看它是否包含模板。我的問題是我忘了在更新的元素上下文中選擇.js-user-template類。這導致了模板綁定4次,而不是一個...

對不起,浪費你的時間,希望這個問題仍然可以幫助有同樣的問題的人。