我有多个 EntitySets 我想在我的 SAP 后端更新,因此我将我的数据(有效负载)作为 JSON 获取并将其放入请求中(它成功地在节点“数据”中):
代码:
var oTreeJSON = oTreeTable.getModel().getProperty("/root");
var oModel = sap.ui.getCore().getModel();
var batchChanges = [];
for (var i = 0; i < oTreeAll.length; i++) {
batchChanges.push(oModel.createBatchOperation("/sap/opu/odata/sap/MY_SERVICE/?$batch", "POST", oTreeAll[i]));
}
oModel.submitBatch();
Run Code Online (Sandbox Code Playgroud)
我的请求如下所示:

它应该到达 SAP 的哪个位置(哪种方法)?我做错了什么,任何地方都没有错误,但是我的后端没有调用......很高兴每一个提示!谢谢。
降低复杂性的工作示例:
var oEntry = {};
oEntry.MyId = "00000001";
oEntry.Value = "300";
batchChanges.push(oModel.createBatchOperation("MyEntitySet", "POST", oEntry, null));
oModel.addBatchChangeOperations(batchChanges);
oModel.setUseBatch(true);
oModel.submitBatch();
Run Code Online (Sandbox Code Playgroud)
为了记录,方法调用:
我在 Visual Studio 代码 1.2/1.3 中有一个 openui 项目设置,所有必需的库(openui 运行时文件)都在 /resources 目录中,并且采用 .js 格式。我没有从这些库中获得任何智能感知。我已经按如下方式设置了我的 jsconfig.json。任何人都可以帮助我如何获得相同的智能感知。
jsconfig.json:
{
"compilerOptions": {
"target": "ES6"
},
"files": [
"/resources/sap/m/*",
"resources/sap/ui/*"
]
}
Run Code Online (Sandbox Code Playgroud) 我是 SAPUI5 的新手,我在导航、侧边栏和标题方面遇到了一些问题。我想开发一个带有标题和侧边栏的应用程序。为此,我使用了“ToolPage”。每个页面都包含工具页面,如下所示:
<mvc:View >
<tnt:ToolPage id="toolPageId">
<tnt:header>
<core:Fragment ...> </core:Fragment>
</tnt:header>
<tnt:sideContent id="SideContentId">
<core:Fragment ...> </core:Fragment>
</tnt:sideContent>
<tnt:mainContents>
<NavContainer id="pageContainerId" width="100%">
<Page ...>
<content>
...
...
</content>
</Page>
</NavContainer>
</tnt:mainContents>
</tnt:ToolPage>
</mvc:View>
Run Code Online (Sandbox Code Playgroud)
它们都与此类似,只是在内容标签中有不同的代码。
有了这个,我实现了我想要的布局,并使用 manifest.json 中的路由进行导航。我为每个页面都有一个控制器,并使用以下命令导航:
onNavToBeTask: function(oEvent) {
this.getRouter().navTo("pageTasklist");
}
Run Code Online (Sandbox Code Playgroud)
我现在遇到的问题是,每次导航时,标题和侧边栏都会再次加载,并且侧边栏中的错误字段将突出显示。
我找到了一个示例,但这里包含 .xml 和 .js 文件中的所有代码,这些代码非常不清楚 https://sapui5.netweaver.ondemand.com/sdk/explored.html#/sample/sap .tnt.sample.ToolPage/代码
我的问题是:
编辑:
在我的 SAPUI5 应用程序中,我使用 sap.tnt.Toolpage 作为主布局容器。SideNavigation 显示应用程序链接列表,并且 mainContents 使用 sap.ui.core.routing.Router 动态加载。
导航到我正在使用的详细信息页面
var router = sap.ui.core.UIComponent.getRouterFor(this);
router.navTo("MyDetailRoute", {
detailItemId: oItem.getBindingContext("oDataSourceName").getProperty("DETAILID")
});
Run Code Online (Sandbox Code Playgroud)
这将加载一个详细信息视图,然后将其控件绑定到我的数据源中的数据。
当我试图记住用户将他的更改保存回服务器时,问题就出现了。我基本上想中断导航以询问用户是否愿意 a) 取消他的更改,b) 保存他的更改或 c) 留在详细信息页面上。虽然 a) 和 b) 很容易实现,但我不知道如何防止导航发生。
到目前为止,我已经通过订阅 onBeforeHide 来尝试我的观点:
var view = this.getView();
var that = this;
view.addEventDelegate({
onBeforeHide: function (evt) {
var oModel = that.getModel("oDataSourceName");
if (oModel.hasPendingChanges()) {
// How to prevent leaving the page?
}
}
});
Run Code Online (Sandbox Code Playgroud)
我尝试过但不起作用的事情:
选项 3) 实际上会阻止导航,但会导致以后出现问题,因为 URL 仍然会更改...
有没有人有想法?
编辑:多亏了 cschuff 的回答,我才能让它工作。对于将来遇到同样问题的任何人:
// In onInit: …Run Code Online (Sandbox Code Playgroud) All other routings are fine, but for some reason the main controller is being called twice. Why would this happen?
onInit: function() {
var oRouter = this.getOwnerComponent().getRouter();
oRouter.getRoute("main").attachMatched(this._onRouteMatched, this);
this.getView().setModel(new JSONModel({
Jobs: []
}), "job");
},
Run Code Online (Sandbox Code Playgroud)
Is this down to the routing config?
"rootView": {
"viewName": "CompleteSurvey.view.Main",
"type": "XML"
},
"routing": {
"routes": [{
"name": "main",
"pattern": "",
"target": ["main"]
}],
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"viewPath": "CompleteSurvey.view",
"controlId": "app",
"controlAggregation": "pages"
},
"targets": {
"main": {
"viewName": "Main" …Run Code Online (Sandbox Code Playgroud) 标准刷新/刷新离线 oData 功能在离线存储中的所有实体上执行。
当然,这会对移动数据和性能产生影响。
有没有办法只刷新/刷新离线商店中的特定实体?
在我的 UI5 应用程序中,我有一个带有表 ( sap.m.Table)的视图,由来自后端onInit挂钩的数据填充。问题是onInit每个视图实例只执行一次:
与
onBeforeRendering和onAfterRendering钩子不同,它每个 View 实例只调用一次。
并且如果用户决定离开该视图(例如,返回导航)并稍后重新打开它,则该视图onInit将不会被调用,因此不会再次检索数据,并且表格内容将不会反映可能的更改。
为确保每次打开视图时都检索数据,我尝试在 处获取数据onBeforeRendering,但此挂钩也仅调用一次。我发现,在onBeforeRendering每次打开视图时强制调用的唯一方法是将以下代码添加到onInit方法中:
onInit: function () {
this.getView().addEventDelegate({
onBeforeShow: this.onBeforeShow,
}, this);
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
为什么在没有上面的代码片段的情况下onInit,onBeforeRendering每次显示视图时都不会触发?
上面的代码片段究竟做了什么?
替代技术:使用patternMatched和routeMatched。但是这三种方法中哪一种更常见呢?
我有一个基于 UI5 的应用程序 (1.66+),它可以正常工作,但屏幕左右两侧有巨大的空白区域(又名信箱打开):
我想禁用信箱以使用整个屏幕空间。
到目前为止,我尝试了以下方法:
"fullWidth": true在manifest.json 的sap.ui部分中使用<html class="sap-desktop sapUiMedia-Std-Desktop sapUiMedia-StdExt-LargeDesktop">
Run Code Online (Sandbox Code Playgroud)
appWidthLimited: false到index.html:<script>
sap.ui.getCore().attachInit(function () {
new sap.m.Shell({
app: new sap.ui.core.ComponentContainer({
height: "100%",
name: "APPNAME"
}),
appWidthLimited: false
}).placeAt("content");
});
</script>
Run Code Online (Sandbox Code Playgroud)
就像《如何在 SAPUI5 中自定义 Shell 容器》中描述的那样。
但它们都不适合我。
更新:
我成功地通过静态 XML 模板解决了这个问题——只需添加<Shell id="shell" appWidthLimited="false">到主 XML 模板中,但现在我想了解如何通过 JS 在new sap.m.Shell(…)定义中实现它。
代码实验的起点如下。
索引.html:
<!DOCTYPE html>
<html>
<head> …Run Code Online (Sandbox Code Playgroud) 我通常在 下的清单中声明应用程序依赖的所有标准库sap.ui5/dependencies/libs。
现在我应该在 bootstrap 参数中放入什么data-sap-ui-libs,相同的库?如果我少放/多放会有什么影响data-sap-ui-libs?它们有何不同?
附言。我在 SAP 的文档中找不到这一点,但请证明我错了。:-)
我正在尝试按照sap.ui.table.TreeTable 中的 OData 示例将 OData 绑定到树表
我已经尝试了基本绑定与treeAnnotationPropertiesxml 中的设置和注释绑定(我已经检查了$metadata查询,它有sap:hierarchy-等)。
但是,两次我都得到重复的节点,例如:
Id | Title | Hierarchy Level | ParentID
----------------------------------------------------
1 | izparent | 0 | 0
|--1 | izparent | 0 | 0
| |-- ...
|--2 | izchild | 1 | 1
2 | izchild | 1 | 1
Run Code Online (Sandbox Code Playgroud)
我得到一个 ID 为 1 的节点,它是可扩展的,而节点 2 是不可扩展的。但是如果我展开节点 1,我再次得到可展开的节点 1 和节点 2,我可以重复展开节点 1 以获得相同的结果。
我有一种感觉,我有一个与此处类似的问题,但也没有为此提供答案:How to define tree table annotation (XML view)
我正在使用 …