我在根目录[appname].js
编写了大部分代码,在app / client / compatibility中编写了一些第三方库
我能够加载这些库,并在我的Template.template1.rendered
处理程序中声明并实例化它们中的对象,这非常有用。
但是,当我想修改Template.template2.events
中的一个变量时,特别是更改选择器时的事件。当我尝试从这里更改它时,它告诉我我的变量未定义。
我已尝试在isClient
中声明文件顶部的变量,但这似乎并不重要。没有在那里定义的场景。
所以我的问题是如何在Template.template2.events
中修改此变量?
var something;
if ( Meteor.isClient ) {
function doSomething(some, value) {
some.property = value;
}
Template.template1.rendered = function() {
if(!this._rendered) {
this._rendered = true;
this.something= thirdParty.Create();
doSomething(this.something, document.getElementById("text").value);
}
}
Template.template2.events({
"change select" : function( event ) {
doSomething(this.something, input );
}
});
something
函数中的doSomething
表示从change select
事件调用时未定义。
答案 0 :(得分:0)
我不相信这个问题只是范围而是背景。在rendered
函数中(您现在应该使用onRendered()
回调),this
的值将设置为正在呈现的模板实例:
http://docs.meteor.com/#/full/template_onRendered
另一方面,在模板事件(和帮助程序)中,this
的值设置为数据上下文 - 不模板对象。但是,您可以访问模板实例,因为它作为事件映射函数的第二个参数传递:
http://docs.meteor.com/#/full/eventmaps
我们还没有完全清楚您的代码所需的范围。但是,您当前的代码包括:
var imageViewer;
以上是在本地文件范围内声明的(但可以关闭)
Template.ocr_results.rendered = function() {
this.imageViewer = thirdParty.Create();
}
以上内容被声明为刚呈现的模板实例的属性(ocr_results的一个实例)。
Template.ocr_form.events({
"change select" : function( event ) {
changeImage(this.imageViewer, input );
}
});
以上对this.imageViewer
的引用未定义,原因有两个。首先,this
是数据上下文,而不是模板实例。其次,即使您编写了以下代码来使用模板实例,它也会引用ocr_form
模板实例,而不是ocr_results
模板实例(这是您在第二个块中定义它的位置)上面的代码。
Template.ocr_form.events({
"change select" : function(event, template) {
changeImage(template.imageViewer, input );
}
});
上述情况仍然未定义。
正如@Curtis建议的那样,你应该删除两个你的this.
前缀以使你的代码正常工作,但创建和使用(关闭)变量只是一次可能不是你的& #39;之后 - 因此冗长的解释!