javascript - Angular中与同级指令/ Controller 相关的列表(和主控/详细信息)

标签 javascript angularjs angularjs-directive angularjs-scope

我大约有四对主要的相关指令,同时显示在我的AngularJS UI中。一般而言,每对都在其顶部包含一个父列表指令,并在其下方包含一个相关的明细编辑器指令,如下图所示:



每个右手列表与活动的左手选择都具有多对一关系,并且必须始终显示相关数据。我应该如何驱动相关列表(从左到右的关联)刷新?



当前,每个主从指令对或“堆栈”共享一个服务。该服务保存itemState.active(活动详细记录)和itemState.headers(查询主结果列表)。主面板或详细信息面板中的活动将调用服务,这直接影响服务状态。然后,通过此公共positionService.state上的简单声明性Angular手表操作主/明细关联。几乎不需要控制器代码。我希望将服务用作此处的单个事实点,这将使我将来可以更轻松地集成近乎实时的显示,例如通过SignalR。尽管我欢迎改进,但此处仅提供此主从实现作为背景:

主指令,例如position-list.js

templateUrl: "position/position-list.html",
controller: ['$scope', 'positionSvc', function ($scope, positionService) {
    $scope.positions = positionService.itemState();
    $scope.select = function (position) {
        positionService.read(position.id)
    };
}


主模板,例如position-list.html

<li ng-repeat="i in itemState.headers" ng-click="select(i)">{{i.title}}</li>


服务,例如position-svc.js

this.itemState = {
    headers: [],
    active: { id: 0 },
    pending: httpSvc.pending
};

this.create = function (detail) {
    httpSvc.remote("post", detail).then(function (header) {
        itemState.headers.unshift(header);
        read(detail.id);
    });
}

this.read = function (id) {
    httpSvc.remote("get", id).then(function (detail) {
        itemState.active = detail;
    });
}


对于细节,存在类似的指令和模板。它共享相同的服务。你明白了。

现在,我正在寻找一种可维护的方法,以遵循良好的设计实践和著名的AngularJS模式来处理左右事件。我想保留指令的可组合性。



为了证明我不是要您为我做我的工作(并组织我自己的想法),我想出了一些方法,尽管到目前为止,似乎还没有一种方法可行。我将继续记录这些,如果需要清理此部分,请再次检查。它们按消息路径分组:


leftController-> mainApp-> rightController


部分A:leftController-> mainApp


mainApp.$scope.onLeftItemSelected(例如通过{ scope: '&' }
leftController.$scope.$emit中的leftController.watch
leftController.$parent.onLeftItemSelected(例如AngularJS access parent scope from child controller,但错误地创建了自下而上的依赖性)

b部分:mainApp-> rightController


mainApp.$scope.$broadcast
mainApp.rightService.load(leftItemId)


leftController-> mainApp模型-> rightController。$ watch


在leftController和rightController之间共享父范围变量
使用{ scope: '=' }将隔离的范围从leftController传输到mainApp;这是JesúsQuintana的解决方案,下面和这里:http://plnkr.co/edit/tyZPziT9VoWDFqHdF8A5?p=preview

leftController-> $ route-> rightController


实现这一点可能是理想的,它允许我在单页面应用程序中提供深层链接/书签,但需要在选择子项时使页面能够加载父级层次结构,而不是相反(加载相反的子记录)选定的父项)。这需要比我目前可以证明的更大的初始投资。 http://embed.plnkr.co/DBSbiV/preview

leftService-> rightService


也将nominationService注入同级positionService中。设置nominationService.load(positionid)时呼叫positionService.activeRecord。优点:已经在工作了。骗子:错。这种同级依赖性使父列表不可重用。
添加自定义发布/订阅服务(https://stackoverflow.com/questions/16235689#16235822http://jsfiddle.net/ThomasBurleson/sv7D5/

leftService-> $ rootScope.broadcast-> rightService


不理想,假设我们的事件字符串在根名称空间中是唯一的(但性能问题已得到解决,如此处https://stackoverflow.com/questions/11252780#19498009所述)

leftService-> mainApp-> rightService


positionServicenominationService注入mainApp中。向positionService添加一个简单的事件列表,以向上传输通知。 PRO:对于整个应用程序中的活动记录,这保留了leftService的角色作为单一事实点(如Martin Cortez在下面的评论中所述)

leftService-> $ rootScope。$ route-> rightController-> rightService


请参阅方法3的注释



参考文献
pass data between controllers
How to communicate between controllers while not using SharedService between them?

最佳答案

基于角度模式设计,最好的方法是通过“ =”(双向绑定)指令绑定作用域,并在指令内部创建一个$ scope。#watch来检测元素绑定的变化并执行给定变量的动作函数。

是在两个指令之间进行通信的更简洁的方法,可以角度检测更改并将其扩展到机器人指令。

抱歉,如果答案没有用,但问题解释得不好。

关于javascript - Angular中与同级指令/ Controller 相关的列表(和主控/详细信息),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26434618/

相关文章:

javascript - 在javascript中,NEW函数是否有可能返回NULL?

javascript - Protractor 元素 (..) 从单独的文件返回未定义

javascript - AngularJS - 使用 $valid 进行动态验证

javascript - 在指令中访问 child 的 '$invalid' 验证 Prop

javascript - 为什么这段代码中的js事件没有冒泡?

javascript - 具有大量相互依赖事件的实体的设计模式

javascript - 以 JSON 格式发布数据

javascript - 使用 ng-repeat 后如何显示唯一值?

javascript - 在路由更改不起作用后取消angularjs超时

jquery - 根据元素数量布置 HTML 元素