我在C#中的MVC4项目中有一个单页面应用程序。
在我的HTML中,我有一个类似于表格的列表 - 首先是表格标题,第二个是带有" foreach" property(knockout)并显示我列表中的所有项目。
现在,我需要这个" table"要动态 - 我会得到一个列列表和"指令" (列标题,列类名,列值名称,css条件等),HTML将动态构建。 淘汰赛有可能吗?
这是我的代码。只有5列。我需要它是动态的,所以我可以通过更改指令列表轻松添加(和删除)列,而无需触摸HTML。
<ul class="assetsTitles">
<li class="ItemKey" data-bind="click: sortBy.bind($data, 'Key'), css: { selected: Filter().OrderBy() == 'Key', desc: Filter().Descending() }"><span>Key</span></li>
<li class="ItemName" data-bind="click: sortBy.bind($data, 'Name'), css: { selected: Filter().OrderBy() == 'Name', desc: Filter().Descending() }"><span>Item Name</span></li>
<li class="ItemProp1" data-bind="click: sortBy.bind($data, 'ItemProp1'), css: { selected: Filter().OrderBy() == 'ItemProp1', desc: Filter().Descending() }">ItemProp1</li>
<li class="ItemProp2" data-bind="click: sortBy.bind($data, 'ItemProp2'), css: { selected: Filter().OrderBy() == 'ItemProp2', desc: Filter().Descending() }">ItemProp2</li>
<li class="ItemProp3" data-bind="click: sortBy.bind($data, 'ItemProp3'), css: { selected: Filter().OrderBy() == 'ItemProp3', desc: Filter().Descending() }">ItemProp3</li>
</ul>
<div data-bind="foreach: items, visible: items().length > 0">
<div class="itemRow" data-bind=" attr: { id: RowId() }">
<ul class="itemRowDetails " data-bind="visible: ShowDetails, selected: IsSelected, click: $parent.showItemDetails.bind($data, $data, $parent.type), css: { selected: IsSelected() }">
<li class="ItemKey" data-bind=" title: Key"><span data-bind="text: Key" /></li>
<li class="ItemName" data-bind=" title: Name"><span data-bind="text: Name" /></li>
<li class="ItemProp1" data-bind=" title: ItemProp1"><span data-bind="text: ItemProp1" /></li>
<li class="ItemProp2" data-bind=" title: ItemProp2"><span data-bind="text: ItemProp2" /></li>
<li class="ItemProp3" data-bind=" title: ItemProp3Display"><span data-bind="text: ItemProp3Display, css: { alertDetail: ItemProp3Alert, alertDetail2: ItemProp3Alert2 }" /></li>
</ul>
</div>
</div>
答案 0 :(得分:1)
你可以使用ko.renderTemplate 做一些事情:
<!-- ko foreach:$root.visibleColumns() -->\
<li data-bind=\"attr:{'data-columnname' : columnName}\" role=\"column\" ><span data-bind=\"attr:{'class': columnHeaderCss, 'data-columnname' : columnName,'data-headertext': headerText}, text: headerText\"></span> </li>\
<!-- /ko -->\
并将列列表传递给viewModel:
ko.dataGrid = {
viewModel: function (configuration) {
var me = this;
$.extend(me, {
columns: configuration.columns,
visibleColumns: function () {
var res = [];
$.each(me.columns, function (i, c) {
if (c.visible)
res.push(c);
});
return res;
},
});
}
答案 1 :(得分:0)
您可以尝试使用传统技术在脚本中构建html,然后将其附加到元素。然后将其添加到绑定中,该元素的名称需要包含在第二个参数中:
ko.applyBindings(viewModel,dynamicElement)
或者ko有html(&#34; html:&#34;)和文本绑定(&#34; text:&#34;)选项。
在构建代码中的html时,您可能需要使用&#34;无容器控制流语法&#34;即包括在评论符号中,例如<!-- ko foreach: myItems --> .... <!-- /ko -->
其中myItems是一个数组。
关于可能的注射攻击通常需要注意事项!
自从我玩ko以来已经有一段时间了。