Meteor.js范围问题

时间:2015-07-14 16:33:20

标签: javascript templates meteor scope

我在根目录[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事件调用时未定义。

1 个答案:

答案 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;之后 - 因此冗长的解释!