繁体   English   中英

Meteor.js范围问题

[英]Meteor.js scope issues

我的大部分编码都在[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 );
    }
  });

somethingdoSomething从我的调用时函数说未定义的change select事件。

我不认为这个问题是范围而是背景。 在您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. 前缀使您的代码正常工作,但是仅创建和使用一次(封闭的)变量可能不是您想要的-因此,冗长的解释!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM