EnyoJS: вызов функций enyo из необработанного JavaScript

#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-й пример работает нормально — СПАСИБО. 🙂