#javascript #enyo
#javascript #enyo
Вопрос:
В «старом» enyo для устройств HPalm я смог вызывать свои функции типа enyo из / через JS следующим образом:
<span class="button" onclick="app.doSomething();"></span>
Теперь в enyoJS это не работает. Мой app.js выглядит примерно так:
enyo.kind({
name: "myapp.Application",
kind: "enyo.Application",
view: "myapp.MainView"
});
enyo.ready(function () {
new myapp.Application({name: "app"});
});
Я перепробовал практически все, что мог придумать, но больше ничего не помогает.
var app = new myapp.MainView();
app.renderInto(document.body);
app.doSomething();
^ etc тоже не работает.
Мой MainView:
enyo.kind({
name: "myapp.MainView",
kind: "FittableRows",
classes: "enyo-fit enyo-unselectable",
fit: true,
components:[
//... stuff here ...
],
doSomething: function(){
console.log("Hello!");
}
});
Есть ли способ добиться того, что мне нужно? TYVM
Ответ №1:
Вы на правильном пути. Фактически, ваша попытка создать MainView напрямую работает.
Причина app.doSomething()
, по которой это не работает, заключается в:
- приложение не существует в глобальном пространстве и
- у приложения нет метода doSomething; у MainView есть
Есть несколько способов получить ссылку на ваш экземпляр приложения. Проще всего назначить его глобальному при создании:
var app;
enyo.ready(function() {
app = new myapp.Application({name: "app"});
});
// later
app.doSomething();
Другой вариант — извлечь его из enyo.applications
хэша, который хранит ссылку на каждое созданное приложение по его имени.
enyo.applications.app.doSomething();
Вот полный пример
enyo.kind({
name: "myapp.Application",
kind: "enyo.Application",
view: "myapp.MainView",
doSomething: function() {
this.$.mainView.doSomething();
}
});
enyo.kind({
name: "myapp.MainView",
kind: "FittableRows",
classes: "enyo-fit enyo-unselectable",
fit: true,
components:[
//... stuff here ...
],
doSomething: function(){
console.log("Hello!");
}
});
enyo.ready(function () {
var app = new myapp.Application({name: "app"});
// works, but not recommended as it breaks encapsulation
// app.$.mainView.doSomething();
// preferred but requires a little extra code
app.doSomething();
});
Комментарии:
1. Спасибо. Я попробовал этот глобальный подход, но он не сработал — вот почему я в замешательстве. То же самое для: «enyo.applications.app.doSomething();». Ваш 3-й пример работает нормально — СПАСИБО. 🙂