ugrás a tartalomhoz

A callback fv nem módosítja a változó értékét? (JS) - solved

Reactor · 2012. Aug. 31. (P), 15.13
Sziasztok.
Egy jqueryvel működő szájtot készítek, viszont egy problémát nem sikerült eddig megoldani.

Hiba: a ModuleMGR contObj tagja a setModule tagfüggvény egyik ágában jól módosul, a másikban nem módosul, sőt ?null? értéket kap.
ModuleMGR: egy olyan osztály, amely a használt modulokat kezeli
contObj: a fenti osztály tagja, ami egy modul objektumát tárolja

A kód lényeges része kiemelve: [pastebin]
A hibás rész a 107. sor környékén található (úgy vélem).
A self és self2 változók a próbálkozásaim szüleménye.

Nagyon hálás lennék, ha valaki segítene megtalálni a hibát.


Kód beágyazva:

var modAliases = new Array();
var modDefault = null;

function initSite($){
(...)
//Site Navigation scripts (DOM)
$('img#logo').click(function(){window.location.hash = 'slideshow';});
$('div#mtile1>div.tilespacer').click(function(){window.location.hash = 'static|about';});
$('div#mtile2>div.tilespacer').click(function(){window.location.hash = 'static|inspiration';});
$('div#mtile3>div.tilespacer').click(function(){window.location.hash = 'static|references';});
$('div#mtile4>div.tilespacer').click(function(){window.location.hash = 'static|selfdevelopment';});
$('div#mtile5>div.tilespacer').click(function(){window.location.hash = 'static|press';});
$('div#mtile6>div.tilespacer').click(function(){window.location.hash = 'static|contact';});
(...)
}

//Slideshow
function C_slideshow(params){
    var self = this;
    this.getName = function(){return 'slideshow'};
    this.destroy = function(fncallback){
        $('div#c_lsh').fadeOut(500, function(){
            $('img.lslide_ch').attr('class', 'lslide');
            $('img.lslide_active').attr('class', 'lslide');
            alert("SLIDESHOW DESTROYED");
            fncallback();
        });
        clearInterval(self.shtimer);
    }
    
    this.slideshow_shine = function(){
        $('img#lshshine').stop();
        $('img#lshshine').css('margin-top', 853);
        $('img#lshshine').animate({'margin-top': -1200}, 1000);
    }
    
    this.nextSlide = function(){  
        var ac = self.activeslide;
        var ne = self.activeslide.next('img.lslide');
        if(ne.length == 0){
            ne = $('img.lslide').first();
        }
        ne.attr('class', 'lslide_ch');
        self.activeslide.fadeOut(499,function(){
            ac.attr('class', 'lslide');
            ne.attr('class', 'lslide_active');
            ac.fadeIn(0);
        });
        self.activeslide = ne;
    }
    
    this.activeslide = $('img.lslide').first();
    this.activeslide.attr('class', 'lslide_active');
    this.shtimer = setInterval(this.nextSlide, 5000);
    
    $('div#c_lsh').fadeIn(500, this.slideshow_shine);
}
modAliases['slideshow'] = C_slideshow;
modDefault = C_slideshow;

//Static content
function C_staticcontent(params){
    this.failure = function(){window.location = "404.htm";}
    this.cid = null;
    if(params != null && params.length>0){
        this.cid = params[0];
    } else this.failure();
    
    this.getName = function(){return 'static'};
    this.getcid = function(){return this.cid};
    
    this.destroy = function(fncallback){
        alert("STATIC DESTROYED: " + this.cid);
        this.cdiv.fadeOut(500, fncallback);
    }
    
    this.cdiv = $('div#c_static_'+this.cid);
    if(this.cdiv.length == 0) this.failure();
    if(this.cdiv.length == 0){
        this.cid = 'about';
        this.cdiv = $('div#c_static_'+this.cid);       
    }
    
    this.stdiv = this.cdiv.children('div.stext');
    var div_mleft = this.stdiv.css('margin-left');
    var div_width = this.stdiv.css('width'); 
    
    this.stdiv.css('margin-left', div_width).animate({'margin-left': div_mleft});
    this.cdiv.fadeIn(500);
}
modAliases['static'] = C_staticcontent;

//Module manager
function ModuleMGR(){
    var self = this;
    this.if_cc = false;
    this.contObj = null;
    this.nextModule = null;
    
    this.setModule = function(fn, params){
            self.nextModule = fn;
            if(!self.if_cc){
                if(self.contObj == null){
                    self.contObj = new self.nextModule(params);
                } else {
                    var self2 = this;
                    self.contObj.destroy(function(){self2.contObj = self2.nextModule(params); self2.if_cc = false;})
                    self.if_cc = true;
                    alert("DEBUG MESSAGE: NOT NULL");
                }
            }
    }
    
    this.hashChange = function(){
        var hashparts = window.location.hash.split("|")
        var malias = hashparts[0].substr(1);
        if(typeof modAliases[malias] == "undefined"){
            self.setModule(modDefault, null);
        } else {
            self.setModule(modAliases[malias], hashparts.slice(1));
        }
    }
}
var mMGR = new ModuleMGR();

//Nav.Handler
$(window).hashchange(function(m){return m.hashChange;}(mMGR));



initSite(jQuery);
$(window).hashchange();
 
1

Off

Hidvégi Gábor · 2012. Aug. 31. (P), 15.20
Mindenkinek így kéne kérdést feltenni.
6

Re: Off

T.G · 2012. Aug. 31. (P), 16.05
Hehe… én meg pont azt emeltem ki, hogy a 130 soros kód az nem nagyon barátságos.
2

if(!self.if_cc){

Poetro · 2012. Aug. 31. (P), 15.24
if(!self.if_cc){
4

CC = Content Change

Reactor · 2012. Aug. 31. (P), 15.34
CC = Content Change:
Ha folyamatban van tartalomváltás, akkor csak a következő megjelenítendő modul konstruktorát váltom (az if elágazáson kívül).

Tartalom váltás alatt pontosan azt értem, amíg a destroy által elindított utolsó animáció lezajlik és callback fv lefut.
3

127. sor?

T.G · 2012. Aug. 31. (P), 15.27
Azért ez így nehéz lesz... túl sok a hiba szempontjából felesleges rész.
Ami nekem elsőre furcsa az a 127. sor. Hiányzik a scope!
Nem lenne sokkal egyszerűbb ,ha:

$(window).hashchange(function () {
    mMGR.hashChange();
});  
Írom ezt úgy, hogy igazából a felette lévő részt nem vizsgáltam át. :)
5

Link fent

Reactor · 2012. Aug. 31. (P), 15.59
A nyitóposztba beraktam a lap elérhetőségét, remélem így könnyebb átlátni. A modulok osztályaiból csak a destroy fv érdekes, a többit tényleg kivehettem volna.

Módosítottam az általad írt megoldásra. Igazából végső kétségbeesésembe írtam ilyen vadságokat. :)
Kérdés (talán newbie): Ha azt írom, hogy:
$(window).hashchange(mMGR.hashChange); 
Van a tiéd és ezutóbbi között különbség?
Az mMGR az a külső mMGR mind a kettőnél?
7

new?

T.G · 2012. Aug. 31. (P), 16.06
Egyik ágban használsz new-t, másik ágban nem. Miért?
8

Bingo

Reactor · 2012. Aug. 31. (P), 16.24
Ez most... kicsit szíven ütött :D
Köszönöm szépen!