Ich denke, ich habe eine Schließung Problem, aber ich habe eine harte Zeit zu versuchen, es zu lösen. Ich dachte, dass die Verwendung von $ .map jedes Problem verhindern würde.Wahrscheinlich ein weiteres Javascript Closure Problem
Siehe Javascript unten (erfordern Zepto oder jQuery zu arbeiten) oder den Code Arbeits Zugriff https://jsfiddle.net/rowcp07n/4/:
"use strict";
var log = function(){
var output = document.getElementById('output');
for(var i in arguments){
output.append(JSON.stringify(arguments[i]));
output.appendChild(document.createElement('br'));
output.appendChild(document.createElement('hr'));
}
};
function EmptyAction(){
self = this;
self.play = function(){
self.complete();
};
};
function Scene(row, i){
log('Constructing Scene '+i);
var self = this;
self.index = i;
self.steps = $.map(row, function(col, i){
return new SceneStep(row[i], self, i);
});
}
function SceneStep(col, scene, i){
log('Constructing SceneStep '+i+' for Scene '+scene.index);
var self = this;
self.index = i;
self.action = new EmptyAction();
self.action.parentStep = self;
self.action.complete = function(){
log('Complete handler for SceneStep '+ self.index);
};
self.value = col;
}
var data = [
[1,2,3],
[4,5,6],
[7,8,9]
];
function ViewModel(data){
var self = this;
self.scenes = $.map(data, function(row, i){
return new Scene(row, i);
});
}
var vm = new ViewModel(data);
log('Triggering complete of 0-0');
vm.scenes[0].steps[0].action.complete();
log('calling play() of 0-0');
vm.scenes[0].steps[0].action.play();
Ich erwarte, dass am Ende des Protokolls, um zu sehen, "Complete-Handler für SceneStep 0" aber ich bin immer „Complete-Handler für SceneStep 2“
Kann jemand Punkt für mich, was ich fehle?
Fehlende 'var' von' self = this; 'in' EmptyAction() '(was' self' global macht.) – JJJ
@JJJ 'self' [kann bereits global sein] (https: //developer.mozilla. org/de/docs/Web/API/Window/self) abhängig von der Umgebung;) Es überschreibt es tatsächlich. – CodingIntrigue
Yoo sind beide richtig! Danke Jungs! – Juliano