想从函数中访问变量以在骨干中呈现函数

时间:2016-06-10 09:42:23

标签: javascript json backbone.js

getGeoLevelDetails: function(id) {
  window.gid = id;
}

我想访问window.gid函数

中的renderGeoLevelDetails
renderGeoLevelDetails: function(response, obj){
  var id = this.getGeoLevelDetails.gid;
  console.log(id);
}

它显示输出为

  

未捕获的TypeError:无法读取未定义的属性'gid'

1 个答案:

答案 0 :(得分:1)

您的方法中存在一些错误。

首先你正在定义一个分配给DOM窗口对象的全局变量,这个函数里面我真的不知道它在哪里被声明。但这在这个阶段并不重要。

第二您希望通过调用上述函数来获取分配给全局变量的值,该函数不返回任何内容。

这里有几个选项:要么将值分配给全局变量(这是一种非常糟糕的做法,无论如何都应该避免)。

更好的方法是简单地返回id

getGeoLevelDetails: function(id) {
     return id;
}

稍后您可以通过调用renderGeoLevelDetails函数来获取此ID。

renderGeoLevelDetails: function(response, obj) {
     var id = this.getGeoLevelDetails();
}

请注意,只有在同一范围内调用this.getGeoLevelDetails函数时,这才有效,因为this是同一对象的实例。

您的代码中有关于此行的另一个重大错误:

this.getGeoLevelDetails.gid;

首先,你的作为一个函数调用,但作为一个实例变量,期望返回一个全局声明的对象。这就是你得到的原因:

  

未捕获的TypeError:无法读取未定义的属性'gid'

<强> TL; DR

总而言之,如果您希望将模型中的值传输到视图,可以通过调用视图中的模型来访问它,或者如果您希望在同一视图中获取值,则可以使用所提供的方法上方。

如果上述解决方案都不适合您的需求,您可以采用另一种方法:扩展Backbone对象,然后声明一个接收所需值的对象变量。这样你就可以消除全球污染问题:

示例:

Backbone.Details = _.extend({}, Backbone.Router);   
Backbone.Details.geoLevel = id;

然后可以从应用程序的任何位置访问此变量:Backbone.Details.geoLevel