Javascript 如何引用被敲除组件更改的元素?
我试图构建一个可重用的Knockout.jsJavascript 如何引用被敲除组件更改的元素?,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
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.