AngularJS 指令:使用包含/编译链接集合中的对象
AngularJS Directive: link objects in collection with transclude/compile
我的一个页面需要加载SVG文件然后编辑它。现在,这是一个巨大的指令,既处理整个SVG,也处理与形状相关的每个交互。我想将其拆分,以便我可以将形状的交互放入单独的指令中。
这是我现在所做的:
<svg-canvas
fills="fills"
src="{{svgImageUrl}}
selected-shape="selectedShape"
on-drop-fill="addFill(pathId, fill)"
/>
该指令同时管理每个子形状的父形状 (SVG) 和交互。例如,我向每个形状添加一个单击处理程序,并更新范围上的选定形状。我深入观察填充的变化,查找正确的形状并应用它。
我宁愿做这样的事情:
<svg-canvas src="{{svgImageUrl}}>
<svg-each-shape as="shape" svg-click="selectShape(shape)" svg-fill="fills[shape.id]" on-drop-fill="addFill(shape, fill)"/>
</svg-canvas>
从概念上讲,能够为 svg-click、svg-fill 等创建单独的指令似乎要干净得多。如果你眯着眼睛,这很像ng重复。Ng-repeat允许您将内容的交互与父级分开。最大的区别在于,该指令永远不应该进入 DOM。我只是想要一种分别向每个路径添加指令的方法。
是否可以使用嵌入将集合中的对象(形状)链接到子范围,以便我可以使用它?不把它放在 DOM 中?如何?
您
需要做的就是在父指令中设置transclude: true
,并为每个子指令调用一次 transclude 函数,并在作用域上设置适当的属性,以便子指令可以使用。
下面是一个简化的示例:svgCanvas.js
.directive('svgCanvas', function() {
return {
restrict: 'AE',
transclude: true,
compile: function(tElement, tAttrs, transclude) {
return function(scope, el, attrs) {
return link(scope, el, attrs, transclude)
}
}
}
function link(scope, el, attrs, transclude) {
// ... other code
// after loaded
function afterLoaded() {
el.find("rect, path").each(function() {
var childScope = scope.$new()
// child directives can read ._path to work their magic
childScope._path = $(this)
transclude(childScope, function(clone) {
// You don't have to do anything in here if you don't want
// transclude runs all child directives
})
})
}
}
})
下面是内部指令之一的示例:svgClick.js
.directive('svgClick', function() {
return {
restrict: 'A',
link: function(scope, el, attrs) {
var $path = scope._path
$path.click(function() {
scope.$apply(function() {
scope.$eval(attrs.svgClick)
})
})
}
}
})
这是您将如何使用它
<svg-canvas src="{{svgImageUrl}}">
<svg-each-path
svg-click="selectPath(path.id)"
/>
</svg-canvas>
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 如何使用jQuery自动打开页面上的所有链接
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- jquery动画可以通过编程链接吗
- 在单击href链接的同时下载文件
- 尽管链接成功并已成功下载,但未找到NPM模块
- 制作一个不带HTML a标记但在动画播放完毕后指向其他页面的超链接
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 单击页面上的链接后高度发生变化
- 将纯文本URL转换为可单击链接
- python-selenium-点击上升链接
- 一点javascript元编程&可链接的设置器
- 如何使用Angular 2服务提供包含指向另一个资源的链接/ids的资源集合
- 链接与创建新集合 - 效率
- AngularJS 指令:使用包含/编译链接集合中的对象
- 通过控制台从网站获取链接集合
- 如何使用iron:router为集合中的每个项目创建一个单独的链接
- 当尝试按名称获取链接按钮时,获取HTML对象集合
- 转换 jQuery 对象中的 lodash/underscore 集合(链接)
- undo-preventDefault()或以编程方式禁用链接集合的更好方法