Javascript 如何引用被敲除组件更改的元素?

Javascript 如何引用被敲除组件更改的元素?,javascript,knockout.js,requirejs,dropzone.js,Javascript,Knockout.js,Requirejs,Dropzone.js,我试图构建一个可重用的Knockout.jsupload组件,该组件由表单元素上的Dropzone.js实例化组成 修改的敲除上传组件: define(['knockout', 'dropzone', 'jquery', 'text!components/upload/upload.html'], function(ko, Dropzone, $, htmlString) { function UploadViewModel(params) { var self = th

我试图构建一个可重用的Knockout.js
upload
组件,该组件由表单元素上的Dropzone.js实例化组成

修改的敲除
上传
组件:

define(['knockout', 'dropzone', 'jquery', 'text!components/upload/upload.html'], function(ko, Dropzone, $, htmlString) {
    function UploadViewModel(params) {
        var self = this;

        self.dropzoneId = ko.observable(params.dropzoneId);
        self.postLocation = ko.observable(params.postLocation);

        Dropzone.options.uploadedFilesDropzone = {
            // Dropzone options here
        };
    }

    var myDropzone = new Dropzone('#' +  self.dropzoneId(), { url: self.postLocation() });

    return { viewModel: UploadViewModel, template: htmlString };
});
正在使用的模板:

<form method="post" class="dropzone" enctype="multipart/form-data"  data-bind="attr: { action: postLocation, id : dropzoneId }">
</form>
<button id="upload">Upload</button>
正如您所看到的,当我在DOM中创建我的
upload
组件时,我传递了一个ID和一个action HTML属性,这样我就可以自定义每个上传组件的命名(因为它们应该是可重用的,对吧?)

但是,当我创建一个新的
Dropzone
时,我的
Upload
组件脚本遇到了一个问题:

    var myDropzone = new Dropzone('#' +  self.dropzoneId(), { url: self.postLocation() });
问题是,尽管作为
params
传递我希望ID属性采用的名称,但在调用此函数时,主页面上的敲除绑定尚未发生,因此无论我做什么,传递的任何元素ID都不会被定义,并给出此错误:

Error: Invalid dropzone element.
因为ID为
self.dropzoneId()
的元素尚不存在,因为尚未应用绑定


我能做些什么来解决这个问题呢?

既然我的评论建议奏效了,我就把它写下来作为一个答案


通常,敲除中的任何DOM操作都应该在绑定中完成。任何需要附加到DOM元素的小部件都应该为它们创建自定义BindingHandler。小部件可以在
init
部分创建。

为Dropzone创建自定义绑定并在init中创建它?设置默认值怎么样?dropzoneId是可观察的,因此您可以执行
“#”+(self.dropzoneId()| |“默认区域”)
。如果您有多个这样的dropzone,只需在构造函数中添加一个计数器并将其附加到ID。一旦加载dropzone,请修改ID。@RoyJ,这就是我所做的!谢谢。事实上,这是Steve Sanderson(Knockout.js创建者)的建议。谢谢你,罗伊。
    var myDropzone = new Dropzone('#' +  self.dropzoneId(), { url: self.postLocation() });
Error: Invalid dropzone element.