主干.js视图变量被覆盖
Backbone.js view variables being overwritten
我通过$.each创建视图,所有视图的myId属性总是最终被最后一个元素的myId覆盖。
视图的创建
$('.form').each(function() {
// split class name
var classNameArray = $(this).attr('class').split('-');
// get typeId from last part of classname
var myId = classNameArray[classNameArray.length-1];
new myView({ 'el': $('.form-' + myId), 'myId': myId });
});
初始化我的视图
var myView = Backbone.View.extend({
events: {
},
initialize: function() {
var myId = this.options.myId;
},
test: function() {
console.log(myId); // will return myId of last view created
}
});
如何获取视图以保留其唯一的 myId?
当你这样写的时候——
initialize: function() {
var myId = this.options.myId;
},
它创建一个初始化函数的本地变量(这是一个Javascript的东西,而不是一个Backbone的东西)。
请尝试此操作(创建视图对象的局部变量):
initialize: function() {
this.myId = this.options.myId;
},
test: function() {
console.log(myId); // will return myId of last view created
}
这个 [myId] 不是 中的 [myId]:
initialize: function() {
var myId = this.options.myId;
}
它是来自 [myId] 的:
$('.form').each(function() {
// split class name
var classNameArray = $(this).attr('class').split('-');
// get typeId from last part of classname
var myId = classNameArray[classNameArray.length-1]; //from this myId!!!
new myView({ 'el': $('.form-' + myId), 'myId': myId });
});
因为:
第一:
"var myId = this.options.myId; "
这个 [myId] 是局部变量内的初始化,不能在方法之外访问这个变量。
第二:
console.log(myId); // will return myId of last view created
为什么我们在这里能够访问[myId]?因为这个[myId]是[this.myId],[this]是调用方法的上下文:
new myView({ 'el': $('.form-' + myId), 'myId': myId });
所以,这个 [myId] 是 :
var myId = classNameArray[classNameArray.length-1];
[myId] 是循环变化,所以你总是得到最后一个循环的 [myId] 的值。
溶液:
initialize: function() {
this.myId = this.options.myId;
},
因为 [this.myId] 是 [myView] 的内部变量,所以每次创建 [myView] 的实例时,在 [initialize] 方法中,[this.myId] 都会动态地设置为 [this.options.myId] 的正确值形式。
那种问题,可以参考这篇文章:
http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain
相关文章:
- 像createComment这样的各种自定义变量名在内联javascript中被覆盖,但在外部js中没有.为什么?
- 在javascript中使用覆盖变量是不是一种糟糕的做法
- 由于异步回调,变量被覆盖
- 被覆盖的 setTimeout 变量中的函数
- 定义变量是否比在 JS 中覆盖变量使用更多的资源
- 异步Javascript变量覆盖
- 表,并选择要传递到新页面的rRow(id)(这样它就不会覆盖行选择的变量)
- 敲除js变量覆盖
- 返回语句后的函数声明全局变量不会被覆盖
- 在 forEach 循环中覆盖的变量
- 如何保护全局变量以在 Node.js 中被覆盖
- 两个函数使用相同的变量,都不会覆盖其原始变量
- 长方程与覆盖变量
- 使用相同的覆盖变量的 JavaScript 对象
- 不覆盖变量
- 每次循环覆盖变量
- 从数据库读取时覆盖变量
- JavaScript -用户的安全覆盖变量
- 覆盖变量内容javascript
- 覆盖变量或检查是否存在