WebOS 3.0 Доступ к пользовательскому интерфейсу из функции

Я не могу получить доступ к компоненту enyo Ui из функции: onComplete в WebOS 3.0.

buttonTapped: function(inSender, inEvent) {
    console.log("Button is clicked");
    this.$.txt.setContent(inSender.name + " tapped."); // This worked
    var request = webOS.service.request("luna://com.webos.service.tv.systemproperty", {
        method: "getSystemInfo",
        parameters: {"keys": ["modelName", "firmwareVersion", "UHD", "sdkVersion"]},
        onComplete: function (inResponse) {
            var isSucceeded = inResponse.returnValue;
            if (isSucceeded){
               console.log("Result: " + JSON.stringify(inResponse));
               $.txt.setContent("Result: "+JSON.stringify(inResponse)); // This is not worked
            }
        }
    });
...

Консольный вывод

Button clicked
Result{"modelName":"WEBOS1","firmwareVersion":"03.00.00","UHD":"false","sdkVersion":"03.00.00","returnValue":true} 
Uncaught TypeError: Cannot read property 'txt' of undefined 

Я не нашел никакой документации об этом.


person AC1D    schedule 20.02.2017    source источник


Ответы (1)


Причина ошибки в том, что ваша функция обратного вызова не выполняется в контексте вашего компонента. this не является вашим компонентом (не говоря уже о том, что вам не хватает ключевого слова this перед $.txt...).

Что вам нужно сделать, так это связать контекст функции обратного вызова или использовать его для создания замыкания над переменной, которая содержит ссылку на this.

Это настолько распространенное явление, что Enyo предоставляет для этого вспомогательный метод: this.bindSafely.

Попробуйте следующее:

onComplete: this.bindSafely(function (inResponse) {
    var isSucceeded = inResponse.returnValue;
    if (isSucceeded){
        console.log("Result: " + JSON.stringify(inResponse));
        this.$.txt.setContent("Result: "+JSON.stringify(inResponse));
    }
})

См.: http://enyojs.com/docs/latest/#/kind/enyo/CoreObject/Object:bindSafely

person Pre101    schedule 20.02.2017