2015-06-22 78 views
0

我在MVC 5(KnockoutJS和TypeScript)應用程序中有一個需求,在該應用程序中,當用戶更改選項卡時,必須使用ajax加載一些局部視圖。異步部分視圖加載後敲除綁定不工作

主頁面有一個視圖模型,稍後當用戶更改標籤時,應處理局部視圖的綁定。

問題是,當我加載部分視圖,似乎綁定不起作用。

這些是功能我使用加載的局部視圖,並在頁面ViewModel類應用綁定:

class ExportViewModel 
{ 
public isBusy: KnockoutObservable<boolean>; 

private viewCache: { [key: string]: any } = {}; 

constructor() 
{ 
    this.isBusy = ko.observable(true); 
    this.getView('someId'); 
} 

private showView(view: any): void 
{ 
    var viewContent = $('#view-content'); 
    viewContent.html(view); 
    ko.applyBindings(this, viewContent[0]); 
    this.isBusy(false); 
} 

private getView(someId: string): void 
{ 
    this.isBusy(true); 
    var viewContent = document.getElementById('view-content'); 
    ko.cleanNode(viewContent); 

    var viewName = someId; 
    var view = this.viewCache[viewName]; 
    if(view) 
     this.showView(view); 

    jQuery.get(`BaseUrl/${viewName}`).done((data: any) => 
    { 
     this.viewCache[viewName] = data; 
     this.showView(data); 
    }); 
} 

}

樣品局部視圖是這樣的:

<div class="panel-body"> 
    @using(Html.BeginForm()) 
    { 
     <div class="row"> 
      <div class="col-md-12"> 
       <p> 
        Sample Partial View 
       </p> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-md-12"> 
       <input data-bind="textInput: isBusy"/>      
      </div> 
     </div> 
    } 
    </div> 

在我的情況下,輸入文本是isBusy可觀察函數的內容,不是真或假,並且如果我將輸入綁定到「textInput:isBusy()」,則值爲true這是錯誤的,因爲在applyBinding之後我將它設置爲false。

+0

你能否確認showView方法是否被調用? 另請查看showView方法中引用的是什麼 –

+0

showView將被調用,因爲如果我刪除了applyBinding,則根本沒有任何工作(即使函數體將顯示在輸入中)。我也相信'this'應該指向vm類實例而不是函數本身。 – mrtaikandi

+0

我們缺少一些代碼嗎?我沒有看到isBusy = ko.observable(); –

回答

1

我不知道爲什麼,但我改變了showView函數以下和一切工作。

private showView(view: any): void 
{ 
    var viewContent = document.getElementById('view-content'); 
    viewContent.innerHTML = view; 
    ko.applyBindings(this, viewContent); 
    this.isBusy(false); 
}