Как установить событие "При нажатии" в KnockoutJs
Я новичок в knockoutjs В моем проекте у меня есть список отчетов. когда пользователь нажимает на один из отчетов, следующий div(ReportContentdiv) должен отображать все вложенные отчеты (SubReportName, SubReportDate, SubReportNote, SubReportType) отчета в табличном формате. Я не знаю, как это сделать. Любая помощь с благодарностью
Вот мой код
@@@@@@
--HTML
<div id="ReportNamediv">
<ul class="ulclass">
<div data-bind="template: {name: 'ReportData',foreach:$root.Report}">
</div>
</ul>
</div>
<div id="ReportContentdiv">
//Show Report Content here
</div>
@@@@@@@@
--Script
<script type="text/html" id="ReportData">
<li><a href="#"><span data-bind="text: ReportName"></span></a></li>
</script>
2 ответа
Немного сложно дать точный ответ, не видя вашу модель JavaScript, поэтому я сделаю некоторые предположения. Примечание: я изменил имя $ root.Report на $ root.Reports, так как это список, во множественном числе больше смысла.
Модель Javascript
var model = {
Reports: ko.observableArray([]), //An observable list of reports...you can set this yourself.
SelectedReport: ko.observable(null)
};
HTML
<div id="ReportNamediv">
<ul class="ulclass" data-bind="foreach:Reports">
<li>
<a data-bind="click:$root.SelectedReport">
<span data-bind="text: ReportName"></span>
</a>
</li>
</ul>
</div>
<div id="ReportContentdiv" data-bind="with:SelectedReport">
<table data-bind="foreach:SubReports">
<tr>
<td data-bind="text:SubReportName"></td>
<td data-bind="text:SubReportDate"></td>
<td data-bind="text:SubReportNote"></td>
<td data-bind="text:SubReportType"></td>
</tr>
</table>
</div>
Основной подход к этому состоит в том, чтобы иметь SelectedReport
наблюдаемый, который хранит отчет, выбранный пользователем. Тогда мы можем использовать with:
привязка, чтобы изменить контекст привязки конкретно к SelectedReport
который также будет обрабатывать сценарий, при котором отчет не будет выбран элегантно для вас.
Ваша модель будет выглядеть примерно так:
var model = {
Reports: ko.observableArray(),
SelectedReport: ko.observable(),
ViewReport: function(model) {
this.SelectedReport(model);
}
};
function Report() {
var self = this;
self.Name = ko.observable();
self.Date = ko.observable();
self.Note = ko.observable();
self.Type = ko.observable();
}
Тогда ваша HTML-разметка будет выглядеть примерно так:
<div id="ReportNamediv">
<ul class="ulclass" data-bind="foreach: Reports">
<li>
<span data-bind="text: Name()"></span>
<button data-bind="click: ViewReport">View Report</button
</li>
</ul>
</div>
<div id="ReportContentdiv" data-bind="with: SelectedReport()">
<ul>
<li>
<label>Name:</label>
<span data-bind="text: Name()"></span>
</li>
<li>
<label>Date:</label>
<span data-bind="text: Date()"></span>
</li>
<li>
<label>Note:</label>
<span data-bind="text: Note()"></span>
</li>
<li>
<label>Type:</label>
<span data-bind="text: Type()"></span>
</li>
</ul>
</div>