I'm trying to set some properties inside an object. I'd love not having to tell the object what to expect from the outside (making the object more flexible, imo), so I tried this, without success :
slideshow = {
init : function(data) {
if (!data)
return false;
$.each(data,
function(index, value) {
开发者_开发问答 // this isn't working, and don't know how to
this[index] = value;
}
);
alert(this.options.interval);
return true;
},
};
Think it's pretty clear what's missing.
Any ideas? Cheers!
update
var data = {
options : [
{
interval : 8000,
target : '#slider img',
},
],
images : [
{
img : 'assets/img/assets/img/slider_test_img.png',
title : 'Uniforme de Restauração 1',
description : 'blablabla descricao',
url : 'http://www.google.pt',
},
{
img : 'assets/img/assets/img/slider_test_img.png',
title : 'Uniforme de Restauração 2',
description : 'blablabla descricao 2',
url : 'http://www.google.pt',
},
{
img : 'assets/img/assets/img/slider_test_img.png',
title : 'Uniforme de Restauração 3',
description : 'blablabla descricao 3',
url : 'http://www.google.pt',
},
],
}
You have to keep a reference to this
:
var self = this;
$.each(data, function(index, value) {
self[index] = value;
});
or using jQuery's jQuery.proxy
method:
$.each(data, $.proxy(function(index, value) {
this[index] = value;
}, this));
Otherwise, this
will refer to value
, as described in the documentation.
Either make a direct reference to the object:
$.each(data,
function(index, value) {
// v------direct reference
slideshow[index] = value;
}
);
or don't use $.each()
, and just use a for-in
loop for an object, or a for
for an array, since that won't change the this
value:
// I don't know if data is an Array or an object
for( var n in data ) {
this[ n ] = data[ n ];
}
Or you could use the jQuery.proxy()
[docs] method to establish the this
value in the $.each()
handler.
$.each(data,
$.proxy( function(index, value) {
this[index] = value;
}, this )
);
The problem is that inside the function that you pass to each
, this
no longer refers to slideshow
but to the value
of the current iteration. you need to store a reference to slideshow before going into the each loop:
slideshow = {
init : function(data) {
if (!data)
return false;
var that = this;
$.each(data,
function(index, value) {
that[index] = value;
}
);
},
};
精彩评论