2013-08-18 5 views
0

В следующем JavaScript-коде, если warningBeforeNew является ложным, работает файл с открытым кодом. Тем не менее, это не так, если warnBeforeNew истинно, вместо этого дает ошибку «Uncaught TypeError: невозможно прочитать свойство« root »неопределенного».Код JavaScript не работает в обратном вызове

Я не знаю, связано ли это с областью определения области, но как мне получить код загрузки файла для работы в обратном вызове? Благодарю.

Editor.prototype.open = function(path) { 
    if (Editor.warnBeforeNew==true){ 
    this.showDialog({ 
     dialogLabel: 'You have unsaved changes. Are you sure you want to discard them and open a different file?', 
     submitLabel: 'Discard', 
     cancelLabel: 'Cancel', 
     submitCallback: function() { 
      Editor.warnBeforeNew=false; 
      this.filesystem.root.getFile(path, {}, this.load.bind(this), error.bind(null, "getFile " + path)); 
     } 
    }); 
    } else { 
    this.filesystem.root.getFile(path, {}, this.load.bind(this), error.bind(null, "getFile " + path)); 
    } 
}; 

ответ

2

Вы должны сохранить значение this, потому что, когда функция вызывается, то с другим приемником, чем внешняя функция:

if (Editor.warnBeforeNew==true){ 
    var thing = this; // choose a more meaningful name if possible... 
    this.showDialog({ 
     dialogLabel: 'You have unsaved changes. Are you sure you want to discard them and open a different file?', 
     submitLabel: 'Discard', 
     cancelLabel: 'Cancel', 
     submitCallback: function() { 
      Editor.warnBeforeNew=false; 
      thing.filesystem.root.getFile(path, {}, thing.load.bind(thing), error.bind(null, "getFile " + path)); 
     } 
    }); 
    } else { 
    this.filesystem.root.getFile(path, {}, this.load.bind(this), error.bind(null, "getFile " + path)); 
    } 
+0

Вы забыли заменить '' this' с thing' в затруднительное – Bergi

0

пытаются поймать сферу из бокового обратного вызова и использования Это.

Editor.prototype.open = function(path) { 
var that=this; 
    if (Editor.warnBeforeNew==true){ 
    this.showDialog({ 
     dialogLabel: 'You have unsaved changes. Are you sure you want to discard them and open a different file?', 
     submitLabel: 'Discard', 
     cancelLabel: 'Cancel', 
     submitCallback: function() { 
      Editor.warnBeforeNew=false; 
      that.filesystem.root.getFile(path, {}, that.load.bind(that), error.bind(null, "getFile " + path)); 
     } 
    }); 
    } else { 
    this.filesystem.root.getFile(path, {}, this.load.bind(this), error.bind(null, "getFile " + path)); 
    } 
}; 
+0

Вы забыли заменить '' this' с that' где объять 'метод load' – Bergi

+0

уа вы правы' that.filesystem. root.getFile (путь, {}, that.load.bind (that), error.bind (null, "getFile" + path)); ' –

0

submitCallback на ваш метод showDialog должен быть связан, тоже - он получает доступ this.filesystem.root.… который терпит неудачу.

this.showDialog({ 
    …, 
    submitCallback: function() { 
     Editor.warnBeforeNew=false; 
     this.filesystem.root.getFile(path, {}, this.load.bind(this), error.bind(null, "getFile " + path)); 
    }.bind(this) 
// ^^^^^^^^^^ 
});