2014-01-20 32 views
5

我正在使用的頁面有幾個選項卡,每個選項卡的內容都通過ajax通過向控制器請求部分視圖來加載。問題是部分視圖使用了knockoutjs,所以它被綁定到視圖模型。在這種特殊情況下,頁面首次加載完畢,所以所有的綁定都可以正常工作。切換標籤時,它會請求一個局部視圖,並用新頁面替換標籤內容區域。當您切換回第一個選項卡時,它會成功加載部分內容,除非看起來所有的敲除綁定都已丟失,因此存在大量缺失的數據。當頁面通過ajax以部分方式加載時,如何重新綁定knockout viewmodel?

我不能將viewmodel聲明和模型綁定放在部分,因爲jquery尚未被加載。或者看起來($未定義)。

視圖模型在調用局部視圖的主頁上聲明和綁定,而不是局部視圖本身,所以我認爲模型仍然可用並且綁定成功,但它不成功。我知道我做錯了,當涉及到javscript時,部分觀點是超級無知的,所以我希望能夠從你們那裏竊取一些洞察力。

這裏的基本設置: enter image description here

回答

7

如果能夠綁定到頁面的特定非重疊的地區,那麼你可以選擇調用ko.applyBindings(someViewModel, someDomElement)像這樣的回答:Can you call ko.applyBindings to bind a partial view?

然而,如果你有一個整體視圖模型綁定到頁面,然後通過你想要綁定的部分加載的內容的「孤島」,那麼一個選項將是這樣的:http://www.knockmeout.net/2012/05/quick-tip-skip-binding.html。所以,你可以在容器上設置一個綁定區域,告訴Knockout它的手離開那個區域。然後當你加載部分,你可以放心地呼叫ko.applyBindings(someViewModel, innerContainer)

結合可能看起來像:

ko.bindingHandlers.stopBinding = { 
    init: function() { 
     return { controlsDescendantBindings: true }; 
    } 
}; 

,你會使用它像:

<div id="outerContainer" data-bind="stopBinding: true"> 
    <div id="innerContainer"> 
    ...load your partial here 
    </div> 
</div> 

然後,ko.applyBindings(someViewModel, document.getElementById("innerContainer"));

相關問題