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

Javascript 我应该只在指令的链接fn中进行DOM操作吗?,javascript,angularjs,canvas,Javascript,Angularjs,Canvas,我通常遵循优秀的风格指南,但我不确定以下情况下使用的最佳模式是什么 我有一个创建画布的指令,并调用各种angular服务来绘制画布 代码的一个特定部分非常昂贵,因此我在不同的阶段使用两个画布缓冲区进行绘制。各种来源告诉我所有与“DOM”相关的东西都应该在指令中。我只理解了meean的链接功能。现在,尽管我在指令控制器中创建了两个画布 这是他们最好的地方吗?他们还会或应该去哪里?这有关系吗?我目前的想法是创建一个角度工厂,创建一个可以用这种方式使用的“画布缓冲区”。我唯一关心的是如何管理DOM对象

我通常遵循优秀的风格指南,但我不确定以下情况下使用的最佳模式是什么

我有一个创建画布的指令,并调用各种angular服务来绘制画布

代码的一个特定部分非常昂贵,因此我在不同的阶段使用两个画布缓冲区进行绘制。各种来源告诉我所有与“DOM”相关的东西都应该在指令中。我只理解了meean的链接功能。现在,尽管我在指令控制器中创建了两个画布

这是他们最好的地方吗?他们还会或应该去哪里?这有关系吗?我目前的想法是创建一个角度工厂,创建一个可以用这种方式使用的“画布缓冲区”。我唯一关心的是如何管理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操作是在
链接中进行的,而不是
控制器中进行的,是因为文档中有一些与指令相关的注释

首先,请注意以下事项:

控制器在预链接阶段之前实例化,可以 由其他指令访问

我之所以提到这一行,是因为后面的章节

在链接子元素之前执行。这样做不安全 转换,因为编译器链接函数将无法定位 链接的正确元素

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