2015-06-22 5 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, а не true или false, а также если я изменяю привязку ввода к «textInput: isBusy()», тогда значение равно true, что неправильно, потому что сразу после applyBinding я установил его в false.

+0

Можете ли вы однажды подтвердить, вызван ли метод showView? Также проверьте, что это означает в методе showView –

+0

showView вызывается, потому что, если я удаляю applyBinding, ничего не работает вообще (даже тело функции не будет отображаться на входе). Также я считаю, что «это» должно относиться к экземпляру класса 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); 
} 
Смежные вопросы