javascript - 我应该只在指令的链接 fn 中进行 DOM 操作吗?

标签 javascript angularjs canvas

我一般都关注优秀的 John Papa Angular V1风格指南,但我不确定哪种模式最适合我的以下情况。

我有一个创建 Canvas 并调用各种 Angular 服务来绘制 Canvas 的指令。

一段特定的代码非常昂贵,所以我使用两个 Canvas 缓冲区在不同的不同阶段进行绘制。各种消息来源告诉我所有与“DOM”相关的东西都应该在指令中。我的理解是仅指链接功能。虽然现在我在指令 Controller 中创建了两个 Canvas 。

这是最适合他们的地方吗?他们还会或应该去哪里?这有关系吗?我目前的想法是创建一个 Angular 工厂,它创建一个可以以这种方式使用的“canvasBuffer”。我唯一关心的是管理该 DOM 对象的生命周期,这再次违背了仅在指令中进行 DOM 操作的原则。

function thingyDirectiveController($scope, canvasService, drawingService, boundsService) {
    var vm = this;

    // This may want to be moved elsewhere?
    vm.imageBufferCanvas = document.createElement('canvas');
    vm.imageBufferContext = vm.imageBufferCanvas.getContext('2d');

    function draw() {

        drawingService.drawBackground(vm.context);

        // Only update if required
        if (vm.videoImage.src != vm.videoFrame) {
            vm.videoImage.src = vm.videoFrame;

            // Draw image to buffer
            vm.imageBufferContext.drawImage(vm.videoImage, 0, 0, vm.videoImage.width, vm.videoImage.height);

            // etc ...
        }
    }
}

最佳答案

你听到人们提到 DOM 操作是在 link 而不是 controller 中完成的原因是因为文档中有几个与指令相关的注释。

首先,关于 controller 的注释:

The controller is instantiated before the pre-linking phase and can be accessed by other directives

我提到这一行是因为稍后在 link description for pre-linking 下的内容.

Executed before the child elements are linked. Not safe to do DOM transformation since the compiler linking function will fail to locate the correct elements for linking.

因此,通过将这两个注释放在一起,您可以看到不建议您在 Controller 中进行 DOM 操作,因为由于指令可能处于阶段,您可能会遇到元素问题。因此,最佳实践是将链接中所有与 DOM 相关的函数,这样您就不会冒遇到这些类型问题的风险。

关于javascript - 我应该只在指令的链接 fn 中进行 DOM 操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36842554/

相关文章:

javascript - 我如何找到 JavaScript 函数在 Firefox Quantum 调试器中的定义位置?

angularjs - Angular JS - 我如何在模型更改时制作动画?

javascript - 在 AngularJs 中动态显示/隐藏元素

javascript - 如何创建使用node和mongodb发送邮件的api

javascript - 使用 jQuery UI slider 时更新输入值

javascript - 将附加对象传递给第 3 方回调

javascript - Canvas :在绘制的图像和剪辑之间插入渐变矩形

Delphi - 绘制文本,使其在重新绘制其下方的图像后不会消失

javascript - jQuery hoverIntent : 'Uncaught TypeError: Cannot call method ' apply' of undefined'

AngularJS |日期过滤器似乎根本没有改变我的日期显示方式