【问题标题】:can not access element in directive template template无法访问指令模板模板中的元素
【发布时间】:2017-02-14 10:42:15
【问题描述】:

我想从指令中的链接函数访问模板的 DOM 对象,但我不能。我想在一些文件上传后访问这个画布对象来改变它

MakeApp
        .directive('fileUploaderDir', function ($location) {
            return {
                restrict: 'A',
                scope: {
                },
                template: function (elem , attr) {
                    if(attr.maxNumberFile<=1){
                        return'<tbody ng-init="changeCanvas">' +
                        '<tr ng-repeat="item in uploader.queue">' +
                        '<td  ><strong>{{ item.file.name }}</strong>' +
                '<canvas id="canvasImgUpload"/>' +
                '</td>' +
                        '<td ng-show="uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>' +
                        '<td ng-show="uploader.isHTML5">' +
                        '<div class="progress" style="margin-bottom: 0;">' +
                        '<div class="progress-bar" role="progressbar" ng-style="{ \'width\': item.progress + \'%\' }"></div>' +
                        '</div>' +
                        '</td>' +
                        '<td class="text-center">' +
                        '<span ng-show="item.isSuccess"><i class="glyphicon glyphicon-ok"></i></span>' +
                        '<span ng-show="item.isCancel"><i class="glyphicon glyphicon-ban-circle"></i></span>' +
                        '<span ng-show="item.isError"><i class="glyphicon glyphicon-remove"></i></span>' +
                        '</td>' +
                        '<td nowrap>' +
                        '<button type="button" class="btn btn-success btn-xs" ng-click="item.upload()" ng-disabled="item.isReady || item.isUploading || item.isSuccess">' +
                        '<span class="glyphicon glyphicon-upload"></span> Upload' +
                        '</button>' +
                        '<button type="button" class="btn btn-warning btn-xs" ng-click="item.cancel()" ng-disabled="!item.isUploading">' +
                        '<span class="glyphicon glyphicon-ban-circle"></span> Cancel' +
                        '</button>' +
                        '<button type="button" class="btn btn-danger btn-xs" ng-click="item.remove()">' +
                        '<span class="glyphicon glyphicon-trash"></span> Remove' +
                        '</button>' +
                        '</td>' +
                        '</tr>' +
                        '</tbody>' 

                    }
                    else {
                        return '<div class="modal-container" data-toggle="modal" data-target="#modal-h">'
                    }
                },

                      link : function($scope, element, attrs) {
           // $scope.canvasImgUpload = element.getElementById('canvasImgUpload');
           // $scope.canvasImgUpload =  element.find('canvas')[0];
         // $scope.contextImgUpload =  $scope.canvasImgUpload.getContext('2d');

           $scope.changeCanvas=function(){
               $scope.canvasImgUpload    = angular.element(document.querySelector('#canvasImgUpload'));
               console.log("canvass" , $scope.canvasImgUpload);
           }
           $scope.$watch('uploader.queue' , function () {
               alert('queue changeeee');

           })



       } 

我想访问模板中的画布,但它返回空对象!谁能告诉我为什么?

【问题讨论】:

  • 你能展示你的指令是如何在 html 中应用的吗?
  • @BartekFryzowicz
    我在范围内有更多参数,但我将它们从上面的代码中删除以更清晰
  • @faraa。清楚你的要求。如果您想在添加到浏览器之前访问template,您可以在compile 函数中进行。 link 函数中的 element 表示调用指令的宿主元素
  • @GangadharJannu 我想动态访问画布..我有一个表,里面有一些行...当用户上传文件时,这些行添加到表中(对于 eac 行,我有一个canvas)...我编辑了我的代码以显示更完整的模板...你能告诉我我的错误吗?
  • @faraa 我敢肯定你仍然不清楚该怎么做。以动作顺序说明您想做什么,以便我们帮助您解决问题
  • 标签: javascript jquery angularjs angularjs-directive


    【解决方案1】:

    原因可能是您试图在插入 DOM 元素之前对其进行访问。

    解决方案可能是在模板中使用 ng-init。 例如:

    HTML 模板:

    <div class="modal-container" data-toggle="modal" data-target="#modal-h" 
    ng-init='changeCanvas()'>
      <canvas id="canvas"></canvas>
    </div>
    

    指令链接脚本:

    link : function($scope, element, attrs) {    
           $scope.changeCanvas=function(){
           $('#canvas').doSomething();
        }    
    }
    

    【讨论】:

    • 感谢您的回复...我编辑了我的代码以更完整地显示模板...我在上面的代码中也添加了此功能..但它还不起作用!现在这个函数根本不调用了!
    • 使用方括号调用函数。比如:ng-init='changeCanvas()'
    • 谢谢...现在它被调用了。但它还是空的!
    • 上述html中的上传者是什么。它不是很清楚正在上传什么以及如何上传?您还需要注意以下几点: 1. 在 html 文件中编写模板并使用其 url 将其链接到指令。您的代码将更易于理解且更易于编写。 2. 如果您使用的是 ,请记住 angular 不会为您提供将其附加到模型的功能。您需要为此创建一个自定义指令。
    • 我正在使用 angular-file-upload 插件。我在一个新指令中扩展了它......现在我想为指令中的每一行添加图标
    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多