Я новичок в 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;
});
И теперь он хорошо работает. Не понимаю в чем отличия.
Может кто-нибудь объяснить мне, почему?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В вашем component.js вы должны импортировать
"мой / test / comp / Service"
вместо того
"./Услуга"
Здравствуйте, я хотел использовать первое определение службы (первый код) и использовать его в компоненте. Даже при изменении пути зависимости он выдает ошибку, говоря, что Service.getServiceRootPath не является функцией.
В 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();
// ...
},
});
});
Это тоже сработает.
Сообщите нам, если один из ответов поможет решить проблему! Если что-то непонятно, смело оставляйте комментарий! :) В противном случае посмотрите Что мне делать, когда кто-то отвечает на мой вопрос?