Проблема с вашим кодом заключается в том, что вы пытаетесь получить доступ к указателю this вашего класса внутри функции результата метода сканирования.
Чтобы исправить это, сделайте следующее:
scanBarcode(){
//Create 'self' variable outside the scan function, assigning 'this' to it
let self = this;
cordova.plugins.barcodeScanner.scan(
function (result) {
console.log(result.text);
//Use 'self' instead of 'this' to access 'test'
self.test = result.text;
console.log("SB result" + test);
},
function (error) {
alert("Scanning failed: " + error);
}
)
}
Объяснение
Когда вы вызываете функцию .scan(), вы даете ей два обратных вызова. Вы не можете использовать this для выполнения того, что хотите, потому что в Javascript это имеет контекст вызывающей функции.
Обычно, когда вы обращаетесь к «этому» внутри обратного вызова, оно имеет контекст «окна». Это потому, что когда вы (определяете и) вызываете функцию без контекста объекта, вы фактически используете контекст «окна». Пример:
function fun(){ console.log('this = window; in here');
fun();
На самом деле происходит следующее:
window.fun = function() { /* ... */ }
window.fun();
(Для получения дополнительной информации об этом прочитайте о модели объектной ориентации на основе прототипа javascript)
В этом случае у вас будет ошибка Невозможно установить свойство 'test' of undefined. Но, поскольку ваш обратный вызов вызывается непосредственно плагином Cordova, я считаю, что «это» вообще не имеет контекста (хотя я не уверен).
В любом случае, поскольку обратный вызов не вызывается с контекстом экземпляра вашего класса, «это» не представляет экземпляр вашего класса и, следовательно, не имеет свойства «тест».
Наконец, поскольку обратный вызов — это замыкание, а замыкание запоминает среду, в которой оно было создано, обратный вызов знает о существовании переменной self. Вот почему вы можете использовать его в этом случае.
person
igor.araujo
schedule
01.04.2016