sapui5 - 绑定模型更改时 VizFrame 不更新
问题描述
在我看来,我有一个绑定到双向 JSON 模型的属性sap.viz.ui5.controls.VizFrame
。data
此外,我在同一视图中有 aButton
和 a元素。Text
该Text
元素显示模型的值,它与 绑定VizFrame
,并且Button
有一个press
事件处理程序,它增加模型的一个属性的值。
所以,当我按下按钮时,会Text
自动更新,不像VizFrame
. 你对如何解决这个问题有什么建议吗?我看到了这种vizUpdate
方法,但它看起来非常复杂,可能是矫枉过正。但是,更改整个模型也会更改VizFrame
.
代码示例
主视图.xml
<mvc:View controllerName="demo.chart.controller.Main" xmlns:mvc="sap.ui.core.mvc" displayBlock="true" xmlns="sap.m"
xmlns:viz="sap.viz.ui5.controls" xmlns:viz.data="sap.viz.ui5.data" xmlns:viz.feeds="sap.viz.ui5.controls.common.feeds">
<Shell id="shell">
<App id="app">
<pages>
<Page id="page" title="{i18n>title}">
<content>
<VBox>
<viz:VizFrame id="vizFrame" uiConfig="{applicationSet:'fiori'}" vizType='donut'>
<viz:dataset>
<viz.data:FlattenedDataset data="{data>/}">
<viz.data:dimensions>
<viz.data:DimensionDefinition name="Type" value="{manipulatedData>type}"/>
</viz.data:dimensions>
<viz.data:measures>
<viz.data:MeasureDefinition name="Amount" value="{manipulatedData>amount}"/>
</viz.data:measures>
</viz.data:FlattenedDataset>
</viz:dataset>
<viz:feeds>
<viz.feeds:FeedItem uid="color" type="Dimension" values="Type"/>
<viz.feeds:FeedItem uid="size" type="Measure" values="Amount"/>
</viz:feeds>
</viz:VizFrame>
<Button text="+1 Foo" press="onButtonPress"/>
<Text text="Foo: {data>/0/amount} | Bar: {data>/1/amount}"/>
</VBox>
</content>
</Page>
</pages>
</App>
</Shell>
</mvc:View>
主控制器.js
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/model/json/JSONModel"
], function (Controller, JSONModel) {
"use strict";
return Controller.extend("demo.chart.controller.Main", {
onInit: function () {
this.mData = new JSONModel([{
type: "foo",
amount: 23
}, {
type: "bar",
amount: 20
}]).setDefaultBindingMode("TwoWay");
this.getView().setModel(this.mData, "data");
},
onButtonPress() {
this.mData.setProperty("/0/amount", this.mData.getProperty("/0/amount") + 1);
}
});
});
解决方案
我想我想通了。更改模型后,您必须将数据重新绑定到数据集聚合:
工作示例
主控制器.js
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/model/json/JSONModel"
], function (Controller, JSONModel) {
"use strict";
return Controller.extend("demo.chart.controller.Main", {
onInit: function () {
this.mData = new JSONModel([{
type: "foo",
amount: 23
}, {
type: "bar",
amount: 20
}]).setDefaultBindingMode("TwoWay");
this.getView().setModel(this.mData, "data");
},
onButtonPress() {
this.mData.setProperty("/0/amount", this.mData.getProperty("/0/amount") + 1);
this.byId("vizFrame").getDataset().bindData({
path: "data>/"
});
}
});
});
推荐阅读
- vue.js - JSON 内容显示 Tiptap-Vuetify 的空白窗口?
- javascript - 我们如何通过存储在 JavaScript 中两个对象数组中的值来比较对象?
- rust - 如何拥有动态框
>? - python - 如何删除重复项?
- javascript - 兼容模式下正确使用JQuery
- sql - SQL - 聚合函数查询中 .* 和 * 之间的区别
- scala - 如何在 Scala 类定义中使用名为“type”的变量?
- systemd - 服务失败时的 systemd 操作?
- azure - 在 Azure DevOps 中,我正在尝试创建管道以创建测试计划并将存储在 csv 文件中的测试用例上传到测试计划
- laravel - 在 S3 上使用 KMC-CMK 和 laravel