Javascript 如何使用Breeze导航属性对敲除中的html表进行排序?
我使用Breeze.js将我的数据模型交给Knockout.js,在一个相当简单的视图模型中处理适配器库。我使用和此淘汰绑定处理程序在实体属性上创建了排序表:Javascript 如何使用Breeze导航属性对敲除中的html表进行排序?,javascript,jquery,html,knockout.js,breeze,Javascript,Jquery,Html,Knockout.js,Breeze,我使用Breeze.js将我的数据模型交给Knockout.js,在一个相当简单的视图模型中处理适配器库。我使用和此淘汰绑定处理程序在实体属性上创建了排序表: ko.bindingHandlers.sort = { init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { var asc = false; element.style.c
ko.bindingHandlers.sort = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var asc = false;
element.style.cursor = 'pointer';
element.onclick = function () {
var value = valueAccessor();
var prop = value.prop;
var data = value.arr;
asc = !asc;
if (asc) {
data.sort(function (left, right) {
return left[prop]() === right[prop]() ? 0 : left[prop]() < right[prop]() ? -1 : 1;
});
} else {
data.sort(function (left, right) {
return left[prop]() === right[prop]() ? 0 : left[prop]() > right[prop]() ? -1 : 1;
});
}
};
}
};
从js访问my EF中的特定数据将是:specificAdapters()[0].Adapter().BoardName
。像这样使用html:
<table class="tablesorter">
<thead>
<tr>
<th data-bind="sort: {arr: specificAdapters, prop: 'Adapter().BoardName'}">Board Name</th>
<th data-bind="sort: {arr: specificAdapters, prop: 'PbaNumber'}">Pba Number</th>
</tr>
</thead>
<tbody data-bind="foreach: specificAdapters">
<tr>
<td data-bind="text: Adapter().BoardName"></td>
<td data-bind="text: PbaNumber"></td>
</tr>
</tbody>
</table>
然后在查询执行后运行循环,将线路板名称重新映射到另一个实体。不过,这似乎是一个难题,在我的整个应用程序中都必须大量执行,而对绑定处理程序的修复将是最好的解决方案
感谢@awexfwex的回答
我不得不稍微调整一下代码:ko.utils.unwrapObservable
是当前对展开的访问,而leftProp[propNestings[I]
实际上转换了一个嵌套但尚未展开的属性,它将显示为“Adapter()”
。因此,您必须先删除()
,然后才能使用它对数组进行索引
最终代码:
ko.bindingHandlers.sort = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var asc = false;
element.style.cursor = 'pointer';
element.onclick = function () {
var value = valueAccessor();
var prop = value.prop;
var data = value.arr;
var propNestings = prop.split(".");
var propNestingsCount = propNestings.length;
asc = !asc;
if (asc) {
data.sort(function (left, right) {
var leftProp = ko.utils.unwrapObservable(left);
var rightProp = ko.utils.unwrapObservable(right);
for (var i = 0; i < propNestingsCount; i++) {
leftProp = ko.utils.unwrapObservable(leftProp[propNestings[i].replace('()', '')]);
rightProp = ko.utils.unwrapObservable(rightProp[propNestings[i].replace('()', '')]);
}
return leftProp === rightProp ? 0 : leftProp < rightProp ? -1 : 1;
});
} else {
data.sort(function (left, right) {
var leftProp = ko.utils.unwrapObservable(left);
var rightProp = ko.utils.unwrapObservable(right);
for (var i = 0; i < propNestingsCount; i++) {
leftProp = ko.utils.unwrapObservable(leftProp[propNestings[i].replace('()', '')]);
rightProp = ko.utils.unwrapObservable(rightProp[propNestings[i].replace('()', '')]);
}
return leftProp === rightProp ? 0 : leftProp > rightProp ? -1 : 1;
});
}
};
}
};
ko.bindingHandlers.sort={
init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
var-asc=false;
element.style.cursor='pointer';
element.onclick=函数(){
var value=valueAccessor();
var prop=value.prop;
var数据=value.arr;
var propNestings=拆分的项目(“.”);
var propnestingscont=propNestings.length;
asc=!asc;
如果(asc){
数据排序(函数(左、右){
var leftProp=ko.utils.unwrapobbservable(左);
var rightProp=ko.utils.unwrapobbservable(右);
对于(变量i=0;irightProp?-1:1;
});
}
};
}
};
在排序函数中,它假设sort属性只是一个敲除可观察对象的命名属性。您可以尝试递归地展开它们,例如(未测试):
ko.bindingHandlers.sort={
init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
var-asc=false;
element.style.cursor='pointer';
element.onclick=函数(){
var value=valueAccessor();
var prop=value.prop;
var数据=value.arr;
var propNestings=拆分的项目(“.”);
var propnestingscont=propNestings.length;
asc=!asc;
如果(asc){
数据排序(函数(左、右){
var leftProp=ko.不可观测(左);
var rightProp=ko.不可观测(右);
对于(变量i=0;irightProp?-1:1;
});
}
};
}
};
是的,这是假设命名属性,我只是对JS相当陌生,所以我想到了您刚才列出的一些内容,但我不知道如何进行。谢谢你,我今晚会实现这个,然后再回复你。这成功了,我将把完成/测试的代码添加到问题中。另外,ko.utils.unwrapobbservable
是访问当前敲除的正确区域。当使用它们作为数组索引时,我还必须从leftProp
和rightProp
中删除“()”。
var store = em.metadataStore;
var SpecificAdapter = function () { this.BoardName = ko.observable(''); };
store.registerEntityTypeCtor('SpecificAdapter', SpecificAdapter);
ko.bindingHandlers.sort = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var asc = false;
element.style.cursor = 'pointer';
element.onclick = function () {
var value = valueAccessor();
var prop = value.prop;
var data = value.arr;
var propNestings = prop.split(".");
var propNestingsCount = propNestings.length;
asc = !asc;
if (asc) {
data.sort(function (left, right) {
var leftProp = ko.utils.unwrapObservable(left);
var rightProp = ko.utils.unwrapObservable(right);
for (var i = 0; i < propNestingsCount; i++) {
leftProp = ko.utils.unwrapObservable(leftProp[propNestings[i].replace('()', '')]);
rightProp = ko.utils.unwrapObservable(rightProp[propNestings[i].replace('()', '')]);
}
return leftProp === rightProp ? 0 : leftProp < rightProp ? -1 : 1;
});
} else {
data.sort(function (left, right) {
var leftProp = ko.utils.unwrapObservable(left);
var rightProp = ko.utils.unwrapObservable(right);
for (var i = 0; i < propNestingsCount; i++) {
leftProp = ko.utils.unwrapObservable(leftProp[propNestings[i].replace('()', '')]);
rightProp = ko.utils.unwrapObservable(rightProp[propNestings[i].replace('()', '')]);
}
return leftProp === rightProp ? 0 : leftProp > rightProp ? -1 : 1;
});
}
};
}
};
ko.bindingHandlers.sort = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var asc = false;
element.style.cursor = 'pointer';
element.onclick = function () {
var value = valueAccessor();
var prop = value.prop;
var data = value.arr;
var propNestings = prop.split(".");
var propNestingsCount = propNestings.length;
asc = !asc;
if (asc) {
data.sort(function (left, right) {
var leftProp = ko.unwrapObservable(left);
var rightProp = ko.unwrapObservable(right);
for (var i = 0; i < propNestingsCount; i++) {
leftProp = ko.unwrapObservable(leftProp[propNestings[i]]);
rightProp = ko.unwrapObservable(rightProp[propNestings[i]]);
}
return leftProp === rightProp ? 0 : leftProp < rightProp ? -1 : 1;
});
} else {
data.sort(function (left, right) {
var leftProp = ko.unwrapObservable(left);
var rightProp = ko.unwrapObservable(right);
for (var i = 0; i < propNestingsCount; i++) {
leftProp = ko.unwrapObservable(leftProp[propNestings[i]]);
rightProp = ko.unwrapObservable(rightProp[propNestings[i]]);
}
return leftProp === rightProp ? 0 : leftProp > rightProp ? -1 : 1;
});
}
};
}
};