如何处理tvOS MenuBarTemplate选择?

时间:2015-09-21 18:23:39

标签: tvos tvml tvjs

我有一个基本的MenuBarTemplate设置和显示。

如何对用户的菜单选择做出反应并加载适当的内容模板?

2 个答案:

答案 0 :(得分:6)

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's "TVML Catalog" sample中的文件类似。这里指定的load函数调用menuItem的{​​{1}}属性中指定的函数。

答案 1 :(得分:0)

我认为TVML和TVJS与HTML和Javascript类似。当我们想要在用户界面中添加一些交互时,我们应该addEventListener到DOM。

在Apple&#34; TVML目录&#34;中,Presenter.js是一个很好的例子,但它是抽象的,它可以用于不同的当前动作。

当我开发我的应用程序时,我已经编写了这个用于处理menuBar选择的演示。

模块: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就像编写Web应用程序一样。然后,即使在加载XHR之后,您也可以轻松处理menuBarTemplate选择。

避免过多的回调,您应该反复重建代码。 : - )