2017-07-25 10 views
0

JavaScriptオブジェクトのプロパティを参照解除しようとしていますが、期待される結果が得られません。配列内からJavaScriptプロパティを参照解除する

ノックアウトビューモデル(ノックアウトには問題はないと思います)の配列があり、それぞれが観測可能なもの、Selectedを持っています。私はSelectedの値が変更されたときに、crossSelectTargetLangsという関数が呼び出されるように、この観測対象にサブスクリプションを追加します。

さらに、このサブスクリプションをfor...ループ内に追加します。ビューモデルが持っていたにかかわらず、そのうちしかし

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); 
    }); 
} 

、そのSelected、目的関数に渡される引数は常に配列の最後の要素からCode更新観察できるすなわちあるようには見えません参照を外す。

私は間違っていますか?

+0

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

答えて

0

問題は間違った場所で参照解除を行っていることです。 コードは次のようになります。

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); 
 
    
 
}

関連する問題