2

I have a basic MenuBarTemplate set up and displaying.

How do I react to a user's Menu selection and load an appropriate content template?

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);
    }
  }

これは、 Apple の「TVML カタログ」サンプルのPresenter.jsようなファイルを使用していることを前提としています。そこで指定された関数は、 's属性で指定された関数を呼び出すものです。loadmenuItempresentation

于 2015-09-22T02:43:16.327 に答える
0

TVML と TVJS は HTML と Javascript に似ていると思います。ユーザー インターフェイスに何らかのインタラクションを追加したい場合はaddEventListener、DOM を使用する必要があります。

Apple の「TVML カタログ」では、Presenter.js が良い例ですが、これは抽象的であり、さまざまな Present アクションで使用できます。

アプリを開発するとき、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 アプリケーションを作成しているようにする必要があります。menuBarTemplateこれにより、XHR のロード後でも選択を簡単に処理できます。

コールバックが多すぎるのは避けてください。コードを何度も再構築する必要があります。:-)

于 2016-04-26T02:06:38.867 に答える