Определение и использование модуля в отдельном модуле

Я новичок в SAPUI5 и JS. Есть кое-что, что я не очень хорошо понимаю в определении и использовании модуля. Вот мой контекст:

Я хочу создать компонент my.test.comp, который использует объект внешнего модуля my.test.comp.Service. Итак, следуя лучшим практикам, у меня есть следующий код:

Service.js:

sap.ui.define([
  "sap/ui/base/Object"
], function(BaseObject) {
  "use strict";

  var modulePath = jQuery.sap.getModulePath("my.test.comp");
  var SERVICE_ROOT_PATH = modulePath.lastIndexOf("/") > 0
     ? modulePath.substring(0, modulePath.lastIndexOf("/"))
     : "/test";
  var Service = BaseObject.extend("my.test.comp.Service", {
    getServiceRootPath: function () {
      return SERVICE_ROOT_PATH;
    }
  });

  return Service;
});

И я использую это в Component.js:

sap.ui.define([
  "sap/ui/core/Component",
  "./Service"
], function(Component, Service) {
  "use strict";

  return Component.extend("my.test.comp.Component", {
    init: function() {
      var serviceRootPath = Service.getServiceRootPath();
      jQuery.sap.log.error("ServicePathInfo : " + serviceRootPath);
    }
  });
});

Когда я запускаю это, я получаю сообщение об ошибке, что getServiceRootPath не определен, и выдает ошибку.

Итак, я изменил Service.js следующим образом:

sap.ui.define([
  "sap/ui/base/Object"
], function(BaseObject) {
  "use strict";

  var modulePath = jQuery.sap.getModulePath("my.test.comp");
  var SERVICE_ROOT_PATH = modulePath.lastIndexOf("/") > 0
    ? modulePath.substring(0, modulePath.lastIndexOf("/"))
    : "/test";
  var Service = BaseObject.extend("my.test.comp.Service");
  Service.getServiceRootPath = function () {
    return SERVICE_ROOT_PATH;
  };

  return Service;
});

И теперь он хорошо работает. Не понимаю в чем отличия.

Может кто-нибудь объяснить мне, почему?

Сообщите нам, если один из ответов поможет решить проблему! Если что-то непонятно, смело оставляйте комментарий! :) В противном случае посмотрите Что мне делать, когда кто-то отвечает на мой вопрос?

Boghyon Hoffmann 31.10.2018 10:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
86
2

Ответы 2

В вашем component.js вы должны импортировать

"мой / test / comp / Service"

вместо того

"./Услуга"

Здравствуйте, я хотел использовать первое определение службы (первый код) и использовать его в компоненте. Даже при изменении пути зависимости он выдает ошибку, говоря, что Service.getServiceRootPath не является функцией.

Guillaume B. 19.10.2018 11:26

В JS нет классов. Существуют либо простые объекты ({}), либо функции с конструктором, которые можно вызывать с помощью new.

Соответственно, вызов .extend("...") в UI5 возвращает функцию, опять же, с ее конструктором, как и любые другие функции, готовые к использованию с new. Члены вашего модуля (методы, свойства и т. д.) Будут добавлены в прототип, а не в саму родительскую функцию (Service).

BaseObject.extend("my.test.comp.Service", {
  // methods in prototype ...
});

Требуемый модуль Service (то есть функция) состоит только из функции-конструктора (Service.constructor) и объекта прототип (Service.prototype). Вот почему Service.getServiceRootPath не был определен в вашем первом случае. Сначала вам нужно вызвать функцию конструктора с new:

return Component.extend("my.test.comp.Component", {
  init: function() {
    const service1 = new Service(); /* returns an object with ..
    *  __proto__: {
    *    getServiceRootPath: f ()
    *  }
    */
    const serviceRootPath = service1.getServiceRootPath();
    // ...
  },
});

(You could also directly access the method with Service.prototype.getServiceRootPath without new)

Это также объясняет, почему Service.getServiceRootPath работал во втором случае. Вы можете добавить практически все, что захотите, к существующей функции, поскольку функции в конечном итоге тоже являются объектами ?


Похоже, вы намеревались создать не несколько «служб», а простой объект с методами в нем. В этом случае просто верните простой объект с методами в определении вашего модуля.

sap.ui.define([
 // Without "sap/ui/base/Object"
], function() {
  "use strict";
  //...
  return {
    getServiceRootPath: function () {
      // ...
    },
  };
});
sap.ui.define([
  "sap/ui/core/Component",
  "./Service",
], function(Component, Service) {
  "use strict";

  return Component.extend("my.test.comp.Component", {
    init: function() {
      const serviceRootPath = Service.getServiceRootPath();
      // ...
    },
  });
});

Это тоже сработает.

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