正确的方法-Angular JS中指令之间的通信
Right approach - communication among directives in Angular JS
我想问一下在Angular应用程序中处理内部通信的最佳方法是什么
示例如下:
我有一个全屏应用程序,它有一个响应式顶部菜单、一个全屏画布和控件,这些控件完全位于画布的角落。画布应该几乎填满整个屏幕(不包括顶部菜单的空间)。
为了正确计算画布的高度,我需要知道顶部菜单的当前高度(它有可变的高度,例如基于视口宽度)。
我在画布元素上放置了一个指令,它应该适当地调整画布的大小。
但问题是,让指令"知道"菜单高度的最佳方式是什么
- 我应该给指令传递一个额外的参数吗
- 我应该创建一个全球服务来广播这些信息吗
- 我应该让一个父控制器来处理这个吗
- 还是应该使用完全不同的方法
关于应用程序架构模式,Angular官方文档似乎不是很有用。
谢谢。
更新 示例代码
HTML区块
<div workspace-height>
<div ng-include="'components/mainmenu/mainmenu.html'" id="mainMenuWrapper"></div>
<div id="workspace" ng-style="heightMenuExcluded">
<div ng-include="'components/tools/tools.html'" id="toolsWrapper"></div>
<div ng-include="'components/canvas/canvas.html'" id="canvasWrapper"></div>
</div>
</div>
指令
'use strict';
angular.module('photoedit')
.directive('workspaceHeight', ['$window', '$timeout',
function ($window, $timeout) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var window = angular.element($window),
body = angular.element('body'),
mainMenu = element.find('#mainMenuWrapper'),
workspace = element.find('#workspace')
;
console.log(window);
console.log(body);
console.log(mainMenu);
console.log(workspace);
console.log(window.height());
console.log(body.height());
console.log(mainMenu.height()); // null
console.log(workspace.height());
window.on('resize', function(){
var height = workspace.css('height', body.height() - mainMenu.height());
scope.heightMenuExcluded = {'height':height + 'px'};
});
window.trigger('resize');
}
};
}
]);
我无法访问mainMenu高度属性。。。
编辑:添加Plunker。
在您的情况下,我会让指令负责重新调整包含页眉和画布的元素的大小。像这样:
<canvas-app-wrapper>
<header></header>
<canvas></canvas>
</canvas-app-wrapper>
指令看起来是这样的:
app.directive('canvasAppWrapper', function() {
return {
restrict: 'E',
link: function(scope, el) {
var canvas = el.find('canvas');
var header = el.find('header');
var headerHeight = header[0].offsetHeight;
canvas[0].height = el[0].offsetHeight - headerHeight;
canvas[0].width = el[0].offsetWidth;
}
}
})
我觉得这是最有意义的,因为画布独立于页眉,不应该知道它的存在。您可以在包装器中计算所需的大小,并将其传递给canvas指令,或者直接从包装器中更改它。
通常,指令之间通信的最佳方式是通过隔离作用域。每个指令应尽可能独立于其他指令(以实现重用)。指令应该通过其作用域初始化接受参数,仅此而已。当然,使用服务是可以的,但应该以不纠缠组件的方式进行。
相关文章:
- Angularjs事件与发布/订阅指令之间的通信
- 指令之间的连接(Angular 1.4.8)
- angularjs 中控制器和指令之间的通信
- 父关系指令和子关系指令之间的绑定
- 控制器和外部指令之间的双向数据绑定
- 在更改时选择,插入类似函数的参数或指令之间的差异
- 正确的方法-Angular JS中指令之间的通信
- 使用 TypeScript 在 AngularJS 中的指令之间共享来自异步调用的数据
- 服务和指令之间的通信:依赖关系或或事件
- 使用嵌入时,元素和属性指令之间是否有区别
- 在指令和嵌套指令之间共享模型
- AngularJS最佳实践 - 指令之间的通信无需$rootScope
- 在指令之间共享范围 - 缺少$http
- AngularJS在父级和子级范围指令之间共享数据
- 如何在嵌套指令之间共享变量
- 如何在AngularJS指令之间传递对象
- 在 Angular 中,在两个不同的指令之间传达匹配的$index
- 为什么角度绑定在传入时会中断指令之间的绑定
- 指令之间没有数据绑定's的范围及其's模板
- 为什么指令之间的作用域没有连接