2017-02-13 7 views
0

Скажем, у меня есть следующий вид нокаута, как я могу получить внешнийHtml для фактического сгенерированного кода с помощью javascript. Всякий раз, когда я пытаюсь выбрать externalHtml «table_1» с javascript, я получаю html, содержащий разметку нокаута, а не фактический HTML, видимый на экране.Как выбрать фактический HTML, сгенерированный нокаутом?

<table id="table_1"> 
    <thead> 
     <tr> 
      <th>Name</th> 
     <th>Date</th> 
    </tr> 
</thead> 
<tbody> 
    <!-- ko foreach: $data.Rows --> 
    <tr> 
     <td data-bind="text: Name"></td> 
     <td data-bind="text: Date"></td> 
    </tr> 
    <!-- /ko --> 
</tbody> 

+1

Вы должны сначала спросить себя, почему вы хотели бы сделать это в первую очередь. Нокаут предназначен для управления DOM, и вы не должны писать хаки вокруг него. –

+0

Но если вы действительно хотели это сделать, быстрое решение было бы разобрать все с помощью jquery, пересечь каждый узел и просто удалить 'data-bind' с помощью' removeAttr ('data-bind'), '. –

+0

Мне нужно экспортировать html, который нокаут генерирует через javascript. Проблема в том, что внешнийHtml получает только HTML, как он существовал на странице, прежде чем нокаут манипулирует им. – Ryannet

ответ

0

нокаутных компоненты могут обеспечить связанный элемент.

см http://knockoutjs.com/documentation/component-registration.html

ko.components.register('printable-component', { 
    viewModel: { 
    createViewModel: function(params, componentInfo) { 
     console.log(componentInfo.element); 
    } 
    } 
}); 

с помощью этого механизма, а «печати» компонент может быть разработана, который имеет доступ к innerHTML связанного элемента.

// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UI 
 
function AppViewModel() { 
 
    this.Rows = [{ 
 
    Name: 'Joseph', 
 
    Date: '2017-02-13' 
 
    }, { 
 
    Name: 'Mary', 
 
    Date: '2017-02-13' 
 
    }]; 
 
} 
 

 
// define a printable component 
 
ko.components.register('printable-component', { 
 
    viewModel: { 
 
    // create using the factory function 
 
    // see http://knockoutjs.com/documentation/component-registration.html 
 
    createViewModel: function(params, componentInfo) { 
 

 
     // return a new ViewModel for the component 
 
     return new function() { 
 
     this.rows = params.rows; 
 

 
     // track the componentInfo 
 
     this.componentInfo = componentInfo; 
 

 
     // print method function 
 
     this.print = function() { 
 
      alert(componentInfo.element.innerHTML); 
 
     } 
 
     } 
 
    } 
 
    }, 
 

 
    // the component template 
 
    // note: can be jsx 
 
    // note: can be defined in html using internal template nodes 
 
    // note: print button can be hidden using CSS or by defining it outisde the printable component and use the params to start the print function 
 
    template: '<table><thead><tr><th>Name</th><th>Date</th></tr></thead><tbody><!-- ko foreach: $data.rows --> <tr><td data-bind="text: Name"></td><td data-bind="text: Date"></td></tr><!-- /ko --></tbody></table><a href="javascript:void();" data-bind="click:print">print</a>' 
 
}); 
 

 

 
// Activates knockout.js 
 
ko.applyBindings(new AppViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<printable-component params="rows:$data.Rows"></printable-component>