经过长时间的研究,我们决定使用Web API,EF + ASP.NET MVC 4 + Knockout + Breeze为我们的项目。 但我们找不到Breeze的任何工作网格。我们希望将breeze实体绑定到网格,并能够在某些情况下编辑网格上的数据。
我们几乎每天尝试新的网格,但仍然没有运气, 例如,我们尝试了jqxGrid(来自jqWidgets),但它在绑定数据时抛出异常(可能是因为实体之间的循环引用)。如果我们不使用breeze实体并选择一个匿名类型,它就可以了。
你有什么建议吗?
提前致谢。
答案 0 :(得分:7)
我们决定与KoGrid合作,经过一些研究,我们可以做到我们所需要的一切。谢谢大家的帮助。您可以在下面找到我们的测试代码。祝你有愉快的一天。
<!--3rd party library scripts -->
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/json2.js"></script>
<script src="~/Scripts/es5-sham.min.js"></script>
<script src="~/Scripts/es5-shim.min.js"></script>
<script src="~/Scripts/knockout-2.1.0.js"></script>
<script src="~/Scripts/q.js"></script>
<script src="~/Scripts/jquery.json-2.3.js"></script>
<script src="~/Scripts/KoGrid.debug.js"></script>
<script type="text/javascript">
$(document).ready(function () {
var GridViewModel = function () {
var self = this;
self.products = ko.observableArray();
self.currentPage = ko.observable(1);
self.pageSize = ko.observable(10);
self.totalServerItems = ko.observable(80);
self.selectedItem = ko.observable();
self.sortInfo = ko.observable();
self.filterInfo = ko.observable();
self.updateItem = function () { };
var entityModel = window.breeze.entityModel;
var entityManager = new entityModel.EntityManager('api/Service');
var metadataStore = entityManager.metadataStore;
metadataStore.importMetadata($.toJSON(metadata));
var op = window.breeze.FilterQueryOp;
this.getPagedDataAsync = function (pageSize, page, filterInfo, sortInfo) {
var columnName = "ProductID";
if (sortInfo != null)
columnName = sortInfo.column.field + " " + sortInfo.direction;
var query = entityModel.EntityQuery.from("Products").orderBy(columnName).skip((page - 1) * pageSize).take(pageSize);
for (var propertyName in filterInfo) {
query = query.where(propertyName, op.StartsWith, filterInfo[propertyName]);
}
entityManager.executeQuery(query).then(function (data) {
self.products.removeAll();
var items = data.results;
items.forEach(function (item) {
self.products.push(item);
});
});
};
this.dataChangedTrigger = ko.computed(function () {
var page = self.currentPage(),
pageSize = self.pageSize(),
filterInfo = self.filterInfo(),
sortInfo = self.sortInfo();
if (page && pageSize) {
self.getPagedDataAsync(pageSize, page, filterInfo, sortInfo);
}
return null;
});
}
var model = new GridViewModel();
ko.applyBindings(model);
model.getPagedDataAsync(10, 1, model.filterInfo(), model.sortInfo());
});
</script>
<div id="sandBox" class="example" style="height: 600px; width:600px; max-width: 700px;"
data-bind="koGrid: { data: products,
columnDefs: [{ field: 'ProductName', width: 200 },
{ field: 'QuantityPerUnit', width: 200 },
{ field: 'UnitPrice', width: 150 }],
autogenerateColumns: false,
isMultiSelect: false,
enablePaging: true,
useExternalFiltering: true,
useExternalSorting: true,
filterInfo: filterInfo,
sortInfo: sortInfo,
pageSize: pageSize,
pageSizes: [10, 20, 50],
currentPage: currentPage,
totalServerItems: totalServerItems,
selectedItem: selectedItem }">
</div>
<!-- Application scripts -->
<script src="~/Scripts/breeze.js"></script>
<script src="~/Scripts/app/metadata.js"></script>
答案 1 :(得分:5)
我也在寻找网格一段时间了。我检查了jQGrid,koGrid,slickGrid等等。我现在正在使用带有敲除扩展的DataTables,可在此处找到: http://datatables.net/forums/discussion/4969/knockoutjs/p1
它可以使用bootstrap进行样式设置,并且可以使用模板进行高度自定义等等。 您必须在breeze和DataTables之间进行一些链接,但它对我来说非常有用。
答案 2 :(得分:2)
使用KO很容易获得可编辑的网格。
这是一个概念证明:http://jsfiddle.net/vtortola/wx8cL/
(请不要介意CSS:D)
基本上,您可以使用行模板进行查看,使用行模板进行编辑:
<script id="inner-row-tmpl" type="text/html">
<td data-bind="text: par1"></td>
<td data-bind="text: par2"></td>
<td data-bind="text: par3"></td>
<td><button class="edit">Edit</button></td>
</script>
<script id="row-tmpl" type="text/html">
<tr data-bind="template: { name: 'inner-row-tmpl'}">
</tr>
</script>
<script id="editable-inner-row-tmpl" type="text/html">
<td class="editable-row" data-bind="text: par1"></td>
<td><input type="text" data-bind="value: par2"/></td>
<td><input type="text" data-bind="value: par3"/></td>
</script>
干杯。