这种情况有所不同,Sorting Breeze navigation properties除非我确实理解答案是否合适。我发布了澄清。
我有一个名为 MasterTimeline
的复杂对象这是json
[
{
"$id": "1",
"Id": 6,
"Name": "New Construction",
"MasterPhases": [
{
"$id": "2",
"Id": 19,
"Name": "Phase 1",
"MasterTimelineId": 6,
"Order": 1,
"MasterMilestones": [
{
"$id": "3",
"Id": 97,
"Name": "Milestone 1",
"MasterPhaseId": 19,
"Order": 1,
"MasterPhase": {
"$ref": "2"
}
},
{
"$id": "6",
"Id": 98,
"Name": "Milestone 2",
"MasterPhaseId": 19,
"Order": 2,
"MasterPhase": {
"$ref": "2"
}
},
{
"$id": "11",
"Id": 20,
"Name": "Phase 2",
"MasterTimelineId": 6,
"Order": 2,
"MasterMilestones": [
{
"$id": "12",
"Id": 99,
"Name": "Milestone 1",
"MasterPhaseId": 20,
"Order": 1,
"MasterPhase": {
"$ref": "11"
}
},
{
"$id": "17",
"Id": 100,
"Name": "Milestone 2",
"MasterPhaseId": 20,
"Order": 3,
"MasterPhase": {
"$ref": "11"
}
}
"MasterTimeline": {
"$ref": "1"
}
}
]
}
]
阶段和里程碑都有一个客户端配置的Order属性,因为它们是时间轴的一部分,必须按所需顺序设置。所以这里UI和模型重叠。
使用角度和微风我得到时间轴并循环完成各个阶段。
问题: 问题是我无法弄清楚如何根据订单属性订购阶段或里程碑。这似乎是随机的。尽管在API中我已经对有关这些对象的所有方法下了订单。
我尝试了什么: 我尝试的是使用Breeze根据时间线获得所有阶段,然后为每个阶段获得里程碑,代码似乎工作但是我得到角度错误,uri太长,铬只会挂起并填充控制台上有关于uri太长的错误。
<小时/> 添加一些代码: 注意:所有这些都有效,除了我可以订购阶段或里程碑
Web API方法:
[BreezeQueryable(MaxExpansionDepth = 4)]
[HttpGet]
public IQueryable<MasterTimeline> MasterTimelines()
{
return _contextProvider.QueryAll<MasterTimeline>();
}
[BreezeQueryable(MaxExpansionDepth = 3)]
[HttpGet]
public IQueryable<MasterMilestone> MasterMilestones()
{
return _contextProvider.QueryAll<MasterMilestone>().OrderBy(x => x.MasterPhaseId).ThenBy(x => x.Order);
}
[HttpGet]
public IQueryable<MasterMilestoneTask> MasterMilestoneTasks()
{
return _contextProvider.QueryAll<MasterMilestoneTask>().OrderBy(x => x.MasterMilestoneId).ThenBy(x => x.Order);
}
[HttpGet]
public IQueryable<MasterPhase> MasterPhases()
{
return _contextProvider.QueryAll<MasterPhase>().OrderBy(x => x.Order);
}
带有微风的Angular MasterTimeline存储库
function getTimelines() {
var timelines = {};
return EntityQuery.from(controllerMethodName)
.expand("masterPhases, masterPhases.masterMilestones, masterPhases.masterMilestones.masterMilestoneTasks")
//.orderBy(orderBy)
.using(self.manager).execute()
.then(querySucceeded, self._queryFailed);
function querySucceeded(data) {
timelines = data.results;
return timelines;
}
}
页面控制器,其中列出了时间轴(释义)
var vm = this;
vm.timelines {}
function activate() {
var promises = [getItems()];
common.activateController(promises, controllerId)
.then(function () {
log('Activated Timeline View');
});
}
function getItems(forceRefresh) {
return dc.mastertimeline.getTimelines()
.then(
function (data) {
vm.timelines = data;
return data;
});
};
activate();
页面上的Html - 我尽可能地删除了
<table>
<tbody>
<tr data-ng-repeat="timeline in vm.timelines">
<td>{{timeline.name}}</td>
<td>
<table>
<thead>
<tr>
<th colspan="2">Phase(s)</th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="phase in vm.masterPhases">
<td><strong>{{phase.name}} (Order: {{phase.order}})</strong></td>
<td>
<table>
<thead>
<tr>
<th colspan="2">Milestone(s)</th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="milestone in phase.masterMilestones">
<td>{{milestone.name}} (Order: {{milestone.order}})</td>
<td>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
答案 0 :(得分:1)
答案:
除非你不能使用这个解决方案,否则忽略下面的所有内容,但链接如此简单(Zelda?)指出。
其他解决方案
好几天尝试不同的方式。
找到一个有效的解决方案。
简短版本,从Breeze获取数据后,我将子实体集合拉出到自己的js数组中并对它们进行排序。不知道为什么我不能在对象本身中这样做,会让它变得如此简单。
<tr data-ng-repeat="timeline in vm.timelines">
之前的一级儿童:
<tr data-ng-repeat="phase in vm.timeline.masterPhases">
function getItems(forceRefresh) {
return dc.mastertimeline.getTimelines()
.then(
function (data) {
vm.timelines = data;
return data;
});
};
一级儿童:
<tr data-ng-repeat="phase in vm.masterPhases">
function getItems(forceRefresh) {
return dc.mastertimeline.getTimelines()
.then(
function (data) {
vm.timelines = data;
vm.masterPhases = vm.timelines[0].masterPhases;
vm.masterPhases.sort(function (a, b) { return a.order - b.order; });
return data;
});
};
然后获得里程碑的子级别
二级儿童之前:
<tr data-ng-repeat="milestone in phase.masterMilestones">
二级儿童:
<tr data-ng-repeat="milestone in vm.getMasterMilestones(phase.id)">
function getMasterMilestones(phaseId) {
var phase = vm.masterPhases.filter(function(obj) {
return (obj.id === phaseId);
});
var milestones = phase[0].masterMilestones;
return milestones.sort(function(a, b) { return a.order - b.order; });
}
不确定这是否是最好的方法,但它有效。如果BreezeJs可以允许对子导航集合进行排序,那就太好了。
更新:更好的解决方案已实现我不需要过滤,我可以直接将子属性发送到函数中。
<tr data-ng-repeat="timeline in vm.timelines">
第一级
<tr data-ng-repeat="phase in vm.getMasterPhases(timeline.masterPhases)">
function getMasterPhases(phases) {
return phases.sort(function (a, b) { return a.order - b.order; });
}
第二级
<tr data-ng-repeat="milestone in vm.getMasterMilestones(phase.masterMilestones)">
function getMasterMilestones(milestones) {
return milestones.sort(function(a, b) { return a.order - b.order; });
}
答案 1 :(得分:0)
以下是使用angularjs过滤器的方法:
<tr data-ng-repeat="phase in vm.masterPhases | orderBy:'Order'">
<tr data-ng-repeat="milestone in phase.masterMilestones | orderBy:'Order'">
参考: