2

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

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

4

2 回答 2

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 的“TVML 目录”示例中的文件。那里指定的load函数调用menuItem'spresentation属性中指定的函数。

于 2015-09-22T02:43:16.327 回答
0

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

在 Apple 的“TVML 目录”中,Presenter.js 是一个很好的例子,但它是抽象的,可以用于不同的 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像在编写 Web 应用程序一样。menuBarTemplate然后,即使在 XHR 加载之后,您也可以轻松处理选择。

避免过多的回调,你应该一次又一次地重建你的代码。:-)

于 2016-04-26T02:06:38.867 回答