使用AngularJs在实体上订购Breeze Navigation Collection

时间:2014-07-09 19:55:05

标签: angularjs breeze

这种情况有所不同,Sorting Breeze navigation properties除非我确实理解答案是否合适。我发布了澄清。

我有一个名为 MasterTimeline

的复杂对象
  • MasterTimeline
    • - 其中有 MasterPhases 的集合
      • 其中包含 MasterMilestones 的集合。 (不是里程碑也有订单的任务集合)

这是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和模型重叠。

使用角度和微风我得到时间轴并循环完成各个阶段。

    时间轴中的
  • ng-repeat = 阶段阶段
  • 然后,对于每个阶段,我都会遍历里程碑
      阶段中的
    • ng-repeat = 里程碑里程碑

问题: 问题是我无法弄清楚如何根据订单属性订购阶段或里程碑。这似乎是随机的。尽管在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>

2 个答案:

答案 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'">

参考:

https://docs.angularjs.org/api/ng/filter/orderBy