2017-07-25 1 views
0

Ich versuche, eine Eigenschaft auf einem JavaScript-Objekt zu deaktivieren, aber nicht das erwartete Ergebnis.De-referenzieren einer JavaScript-Eigenschaft aus einem Array

Ich habe eine Reihe von Knockout View-Modellen (ich glaube nicht, dass das Problem Knockout-spezifische ist), von denen jede eine beobachtbare, Selected hat. Ich füge eine Subskription zu dieser Observablen hinzu, so dass eine Funktion crossSelectTargetLangs aufgerufen wird, wenn der Wert Selected geändert wird.

Darüber hinaus füge ich dieses Abonnement in eine for... Schleife.

var tl = 0, 
    tlMax = allLangVMs.length, 
    vmLang, 
    selectedCode; 

// for each 'vmLang' view-model in the 'allLangVMs' array... 
for (; tl < tlMax; tl++) { 

    // local variable for the context view-model  
    vmLang = allLangVMs[tl]; 

    // add the subscription to this observable  
    vmLang.Selected.subscribe(function() { 

     // de-reference the vmLang.Code property 
     selectedCode = (function(code) { 
      return code; 
     }(vmLang.Code)); 

     // pass the de-ref'd value to the target function  
     crossSelectTargetLangs(selectedCode); 
    }); 
} 

jedoch unabhängig davon, welche View-Modell hatte seine Selected beobachtbaren aktualisiert, das Argument an die Zielfunktion übergeben ist immer die Code aus dem letzten Elemente im Array, dh scheint es nicht zu sein, De-Referenzierung.

Was mache ich falsch?

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Creating_closures_in_loops_A_common_mistake –

Antwort

0

Das Problem ist, dass Sie Dereferenzierung an einem falschen Ort vornehmen. Der Code sollte wie folgt aussehen:

var tl = 0, 
 
    tlMax = allLangVMs.length, 
 
    vmLang, 
 
    selectedCode; 
 

 
// for each 'vmLang' view-model in the 'allLangVMs' array... 
 
for (; tl < tlMax; tl++) { 
 

 
    // local variable for the context view-model  
 
    vmLang = allLangVMs[tl]; 
 

 
    (function(vmLangParam) { 
 
     vmLangParam.Selected.subscribe(function() { 
 
      crossSelectTargetLangs(vmLangParam.Code); 
 
     }); 
 
    })(vmLang); 
 
    
 
}

Verwandte Themen