Как вызвать Layout из себя, чтобы сделать экземпляр - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть Layout (SubMenu100), в котором есть событие для вызова другого Layout (SubMenu200), но он также создает триггер onClick, который создаст экземпляр if layout (SubMenu100) и сам вызовет его, но я не знаю, какчтобы получить экземпляр, подобный следующему коду.

this.SubMenu100 = new SubMenu100();

Я пытаюсь поместить его в Define vars, но выдает мне ошибку.

define([
    'backbone.marionette',
    'underscore',
    'logger',
    'tpl!apps/templates/SubMenu100.html',
    'i18n!apps/nls/Messages',
    'apps/views/SubMenu200',
    'apps/views/SubMenu100'
], function (Marionette, _, Logger, Template, i18n, SubMenu200, SubMenu100) {
    launch: function (e) {
        $("#title_wrapper_div").click(this.callMe);
    },
    callMe: function () {            
        if (this.subMenu100 === undefined) {
            this.subMenu100 = new SubMenu100(); // <- here
        }
        window.App.vent.trigger("dashboard:showView",this.subMenu100, "", "", "", "");
    }
}

Итак, это вопрос, как можноЯ создаю экземпляр SubMenu100 внутри себя?

1 Ответ

0 голосов
/ 04 апреля 2019

Если launch вызывается с контекстом SubMenu100, вы можете сделать this.callMe.bind(this), тогда вы сможете сделать new this() внутри callMe.

Но для простоты вы могли бы сделать это:

define([
    'backbone.marionette',
    'underscore',
    'logger',
    'tpl!apps/templates/SubMenu100.html',
    'i18n!apps/nls/Messages',
    'apps/views/SubMenu200'
  ], function(Marionette, _, Logger, Template, i18n, SubMenu200) {

  var SubMenu100 = Class SubMenu100 {
    launch: function(e) {
      $("#title_wrapper_div").click(this.callMe);
    },
    callMe: function() {
      if (this.subMenu100 === undefined) {
        this.subMenu100 = new SubMenu100();
      }
      window.App.vent.trigger("dashboard:showView", this.subMenu100, "", "", "", "");
    }
  }

  return SubMenu100;
});

Обратите внимание, что каждый launch будет создавать новый обработчик событий на том же элементе (если что-то еще не выполняет надлежащую очистку), и это может привести к ошибкам. Я не рекомендую использовать глобальные селекторы jQuery в базовых компонентах.

Если вы хотите создать экземпляры SubMenu100 и SubMenu200, я бы создал компонент более высокого уровня, отвечающий за это:

require([
// ^ ------ this is NOT SubMenu100 definition
'apps/views/SubMenu100',
'apps/views/SubMenu200',
], function (SubMenu100, SubMenu200) {
  // this is NOT SubMenu100 definition
  launch: function (e) {
    $("#title_wrapper_div").click(this.callMe);
  },
  callMe: function () {            
    if (this.subMenu100 === undefined) {
        this.subMenu100 = new SubMenu100();
    }
  }
});
...