Как справиться с выбором tvOS MenuBarTemplate?

У меня есть базовый MenuBarTemplate, настроенный и отображающий.

Как мне реагировать на выбор меню пользователя и загружать соответствующий шаблон контента?

2 ответа

Решение

В menuItem тег включает в себя template атрибут, указывающий на шаблон для загрузки и presentation атрибут установлен в menuBarItemPresenter,

<menuItem template="${this.BASEURL}templates/Explore.xml.js" 
  presentation="menuBarItemPresenter">
    <title>Explore</title>
</menuItem>

Затем вы можете использовать строку меню MenuBarDocument функция, чтобы связать документ с каждым элементом строки меню.

menuBarItemPresenter: function(xml, ele) {
  var feature = ele.parentNode.getFeature("MenuBarDocument");
  if (feature) {
    var currentDoc = feature.getDocument(ele);
    if (!currentDoc) {
      feature.setDocument(xml, ele);
    }
  }

Это предполагает, что вы используете Presenter.js файл, подобный тому, что в образце Apple TVML. load указанная функция есть то, что вызывает функцию, указанную в menuItem " s presentation приписывать.

Я полагаю, что TVML и TVJS схожи с HTML и Javascript. Когда мы хотим добавить некоторое взаимодействие в пользовательский интерфейс, мы должны addEventListener в DOM.

Presenter.js - хороший пример в каталоге Apple TVML, но он абстрактный, и его можно использовать в различных действиях Present.

Когда я разрабатывал свое приложение, я написал это демо для обработки выбора меню.

Модуль: loadTemplate.js

var loadTemplate = function ( baseURL , templateData ){
  if( !baseURL ){
    throw("baseURL is required");
  }
  this.BASEURL = baseURL;
  this.tpData = templateData;
}

loadTemplate.prototype.loadResource = function ( resource , callback ){
  var self = this;
  evaluateScripts([resource], function(success) {
      if (success) {
          var resource = Template.call(self);
          callback.call(self, resource);
      } else {
          var title = "Resource Loader Error",
              description = `There was an error attempting to load the resource '${resource}'. \n\n Please try again later.`,
              alert = createAlert(title, description);
          Presenter.removeLoadingIndicator();
          navigationDocument.presentModal(alert);
      }
  });
}

module.exports = loadTemplate; 

Модуль nav.js (используйте menuBarTemplate):

import loadTemplate from '../helpers/loadTemplates.js'

let nav = function ( baseURL ){

  var loader = new loadTemplate( 
      baseURL , 
      {
        "explore" : "EXPLORE", 
        "subscribe" : "SUBSCRIBE", 
        "profile" :  "PROFILE", 
        "settings" : "SETTINGS" 
      }//need to use i18n here 
  ); 

  loader.loadResource(`${baseURL}templates/main.xml.js`, function (resource){

    var parser = new DOMParser();
    var navDoc = parser.parseFromString(resource, "application/xml");

    navDoc.addEventListener("select" , function ( event ){
      console.log( event );

      var ele = event.target,
      templateURL = ele.getAttribute("template");

      if (templateURL) {
        loader.loadResource(templateURL,

          function(resource) {
            if (resource) {
              let newParser = new DOMParser();
              var doc = newParser.parseFromString( resource , "application/xml" );

              var menuBarItemPresenter = function ( xml , ele ){
                var feature = ele.parentNode.getFeature("MenuBarDocument");
                if( feature ){
                  var currentDoc = feature.getDocument( ele );
                  if( !currentDoc ){
                    feature.setDocument( xml , ele );
                  }
                }
              };

              menuBarItemPresenter( doc , ele );
            }
          }
        );
      }
    });

    navigationDocument.pushDocument(navDoc);

  });//load from teamplate.

}

module.exports = nav;

Мой код не лучшая практика, но, как вы видите, вам просто нужно addEventListener как вы пишете веб-приложение. Тогда вы можете справиться menuBarTemplate выбор легко, даже после загрузки XHR.

Избегайте слишком большого количества обратных вызовов, вы должны перестраивать свой код снова и снова.:-)

Другие вопросы по тегам