我使用角度2創建簡單的Web應用程序。我在那裏有兩個組件。首先是基本上有一些數據行的表。當點擊行時,第二個組件顯示與行對應的數據。數據是XML,加載到代碼元素。它看起來像Angular 2中的語法高亮
@Component
export class TableComponent {
items: Data[];
selectedItemsXml: string;
...other stuff
//when row is clicked
toggleSelectedRow(rowIndex: number) {
...other stuff related to change row's background color
this.selectedItemsXml = this.items[i].xml;
}
...other stuff again
}
//TableComponent's template
<div>
<table>
...
...*ngFor="let item of items; let i = index;"...
<tr (click)="toggleSelectedRow(i)">
<td>{{item.id}}</td>
<td>{{item.time}}</td>
</tr>
...
</table>
</div>
<xml-detail [xml]="selectedItemsXml"></xml-detail>
@Component
export class XmlDetailComponent {
@Input() xml: string;
}
//XmlDetailComponent's template
<div>
<pre><code>{{xml}}</code></pre>
</div>
一切工作正常,直到我想爲XML添加語法高亮。首先,我想使用插件ng2-prism,但是我遇到了問題以使其正常工作。在我看到它的git回購問題後,我把它扔掉了。我接下來嘗試的是基於這篇文章使用highlight.js創建指令:highlight.js does not work with Angular 2。使用此方法突出顯示Xml,但僅單擊第一次行。當單擊另一行時,甚至不會顯示新的xml。我也嘗試使用prism.js,但我得到相同的行爲。一旦某個xml字符串首次綁定,顯示在代碼元素中並使用highlight.js或prism.js突出顯示,它仍然存在。
我的猜測是它與角度2中DOM和數據綁定的工作方式有關,因爲如果沒有使用語法高亮顯示,我會在每次選擇行時綁定並將字符串傳遞給代碼元素。使用突出顯示會導致綁定字符串,將其傳遞給代碼元素,然後將其重新提交。這意味着在代碼元素內部沒有簡單的字符串,但是有很多樣式化的span元素,當選擇新行時,導致加載新的xml字符串時出現問題。我還嘗試使用Prism.highlight(text_to_prettify)綁定「pre-prettified」字符串,但使用此方法會導致顯示帶有由Prism添加的所有span元素的xml。
現在,我正在思考如何解決這個問題。請給我一些推動我怎麼能使它工作。
我不確定你的意思是「當選擇新行時加載新的xml字符串」。你能澄清這個問題嗎? – pixelbits
你好,我添加了縮短的代碼示例。也許現在更清楚了。 –