【问题标题】:AngularJS - Any way to call javascript after the template is linked?AngularJS - 链接模板后调用javascript的任何方式?
【发布时间】:2012-07-11 18:28:47
【问题描述】:

我正在尝试将 jQuery 插件 (Plupload) 与 AngularJS 一起使用。我创建了一个指令,它将成为我的文件上传“小部件”。指令长这样(链接函数中的代码是the example on the Plupload site的一个非常简化的版本):

.directive('myFileUpload', function () {
    return {
        restrict: 'E',
        replace: true,
        link: function(scope, element, attrs) {
            scope.uploaderProperties = {
                    runtimes : 'html5,flash,html4',
                    url : 'media/upload',
                    max_file_size : '10mb',
                    container: 'fileUploadContainer',
                    drop_element: 'fileUploadDropArea'
            };

            scope.uploader = new plupload.Uploader(scope.uploaderProperties);

            scope.uploader.init();

            scope.uploader.bind('FilesAdded', function(up, files) {
                scope.$apply();
            });
        },
        templateUrl: 'upload.html'
    };
});

我的 upload.html 文件如下所示:

<div id="{{uploaderProperties.container}}">
    <div id="{{uploaderProperties.drop_element}}" style="border: 1px black dashed;">Drop files here<br><br><br></div>
    Files to upload:<br>
    <div ng-repeat="currFile in uploader.files">{{currFile.name}} ({{currFile.size}}) </div>
    <br><br>
    <!-- for debugging -->
    {{uploader.files}}
    <br><br>
</div>

当我在页面上包含带有&lt;my-file-upload&gt; 元素的指令时,所有数据绑定都会正确发生。问题是,当scope.uploader.init(); 运行时,id 还没有被插入到 DOM 中,所以 Plupload 抱怨和中断,因为它无法选择这些元素。如果我只是在模板中硬编码fileUploadContainerfileUploadDropArea id,它就可以正常工作。但是,我真的很想在一个地方定义这些 id。

那么,在链接模板后,有什么方法可以在上传器上运行init()?我考虑过使用$timeout 来延迟它的运行时间,但这对我来说似乎是一个相当大的黑客攻击。有没有更正确的方法来做到这一点?

更新

我像这样将init() 包裹在$timeout

$timeout(function() {
    scope.uploader.init();
}, 2000);

只是为了确保它会按照我的想法运行,而且确实如此,通过这种延迟,插件可以正确设置并正常工作。但是,我不想依赖$timeout 的时间。如果在链接模板后我可以通过某种方式调用scope.uploader.init();,那么一切都应该正常。有人知道这样做的好方法吗?

【问题讨论】:

    标签: javascript plupload angularjs


    【解决方案1】:

    你的问题实际上是相反的 - 链接功能发生在模板被放入之后。所以在这种情况下,模板发生时没有设置 scope.uploaderProperties。

    看起来你的模板对于 templateUrl 选项来说太花哨了,真的。您可以尝试使用 jQuery 手动设置您的 id,或者在 compile 函数中设置所有内容。

    http://docs.angularjs.org/guide/directive

    【讨论】:

    • 过去几天我一直在阅读该文档,但我仍在尝试完全理解其中的一些概念。您说模板发生时没有设置 scope.uploaderProperties,但是当我检查 DOM 时,这 2 个 div 具有来自 uploaderProperties 的正确 ID。我是不是误解了你的意思?另外,使用 compile 函数,我是否只需在 pre 函数中设置所有属性,然后在 post 函数中执行 init ?我仍然不完全理解在编译函数的部分我应该做什么和不应该做什么。感谢您的帮助!
    • 好吧,在 hte 链接功能发生后,id 将在下一次迭代中设置。当模板实际放入时,scope.uploaderProperties 中没有任何内容。然后你设置它,链接函数稍后会找到它。是的,前期和后期的想法听起来是你最好的选择。
    • 我尝试了compile方法,还是有同样的问题。不是我在原帖中描述的问题吗? Plupload 使用 container 和 drop_element 属性中的值来选择这些元素并为插件设置它们。当 init() 方法在链接函数中运行时,id 的 {{}} 尚未被替换,因此无法选择它们。我使用 $timeout 来延迟对 init() 的调用,然后一切正常。我只是不想依赖 $timeout 的时间安排。
    • 如果您在预链接或编译中设置 id(手动,使用 jquery 或其他方式创建元素),然后在后链接中调用 init,它应该可以工作。
    • 是的,我可以看到它工作。它只是没有我想要的那么干净。我知道在 Angular 中使用 jQuery 插件并不总是会产生完美、干净的解决方案。如果有一个模板后链接挂钩来做这种事情,那肯定会很好......感谢您帮助我更好地理解这些事情。
    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 2022-11-22
    • 1970-01-01
    • 2013-05-13
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多