2015-06-22 57 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); 
}