SAPUI5 'Save' 具有 2 个视图的按钮表单

SAPUI5 'Save' Button Form with 2 views

早上好,我是 SAPUI5 的新手,我正在尝试做一个简单的练习。我几乎完成了,但我想实现一个保存按钮来保存数据。现在我有一个 Responsive Table,它显示了一些带有姓氏的名字和一些其他信息。当我单击任何项​​目时,它会转到另一个视图,其中我有一个表单。以这种形式显示数据。但是如果我在那里更改它(不按按钮),信息也会在以前的视图中更改。我还有一个 'Save' 按钮,但我不知道如何实现它,只有当我更改表单的输入值并按下按钮时,它才会保存它并 returns 我到第一个视图,更新了信息。

程序如下所示:

第一个观点:

第二种形式的视图:

所以正如我所说,有没有什么方法可以更改例如第二个视图中的名称,并且只有当我按下 'Save'(Guardar)按钮时它才会在第一个视图中更新?提前谢谢你。

这里是我的 GitHub 中的代码,如果你想下载的话: https://github.com/DarkIceDust/webapp


ListaUsuarios.view.xml(第一个视图):

<mvc:View
   controllerName="sap.ui.demo.walkthrough.controller.ListaUsuarios"
   xmlns="sap.m"
   xmlns:mvc="sap.ui.core.mvc">
   <Table
      id="listaUsuarios"
      headerText="{i18n>TituloListaUsuarios}"
      class="sapUiResponsiveMargin"
      width="auto"
      items="{usuarios>/Usuarios}" >
      <headerToolbar>
         <Toolbar>
            <Title text="{i18n>TituloListaUsuarios}"/>
            <ToolbarSpacer/>
            <SearchField width="50%" search=".buscarUsuarios"/>
         </Toolbar>
      </headerToolbar>
      <columns>
        <Column
            hAlign="End"
            minScreenWidth="Small"
            demandPopin="true"
            width="4em">
            <Text text="{i18n>TituloNombre}"/>
        </Column>
        <Column
            hAlign="End"
            minScreenWidth="Small"
            demandPopin="true"
            width="4em">
            <Text text="{i18n>TituloApellidos}"/>
        </Column>
        <Column
            hAlign="End"
            minScreenWidth="Small"
            demandPopin="true"
            width="4em">
            <Text text="{i18n>TituloTelefono}"/>
        </Column>
        <Column
            hAlign="End"
            minScreenWidth="Small"
            demandPopin="true"
            width="4em">
            <Text text="{i18n>TituloCorreo}"/>
        </Column>
        <Column
            hAlign="End"
            minScreenWidth="Small"
            demandPopin="true"
            width="4em">
            <Text text="{i18n>TituloFecha}"/>
        </Column>
      </columns>
      <items>
         <ColumnListItem
            type="Navigation"
            press="onPress">
            <cells>
                <ObjectIdentifier title="{usuarios>Nombre}"/>
                <Text text="{usuarios>Apellidos}"/>
                <ObjectNumber number="{usuarios>Telefono}" emphasized="false"/>
                <Text text="{usuarios>Correo}"/>
                <Text text="{usuarios>FechaNacimiento}"/>
            </cells>
         </ColumnListItem>
      </items>
   </Table>
</mvc:View>

ListaUsuarios.controller.js(第一个视图的控制器):

sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "sap/ui/model/json/JSONModel",
    "sap/ui/model/Filter",
    "sap/ui/model/FilterOperator"
    ], function ( Controller, JSONModel, Filter, FilterOperator ) {
        "use strict";
        return Controller.extend("sap.ui.demo.walkthrough.controller.ListaUsuarios", {
        
        buscarUsuarios : function (oEvent) {

            // Construye el filtro del array
            var aFilter = [];
            var sQuery = oEvent.getParameter("query");
            if (sQuery) {
                aFilter.push(new Filter("Nombre", FilterOperator.Contains, sQuery));
            }

            // Enlace de filtros
            var oList = this.byId("listaUsuarios");
            var oBinding = oList.getBinding("items");
            oBinding.filter(aFilter);
        },
        
        onPress: function (oEvent) {
            var oItem = oEvent.getSource();
            var oRouter = this.getOwnerComponent().getRouter();
            oRouter.navTo("detail", {
                rutaUsuarios: window.encodeURIComponent(oItem.getBindingContext("usuarios").getPath().substr(1))
            });
        }
    });

});

Detail.view.xml(表单所在的第二个视图的 XML):

<mvc:View
    controllerName="sap.ui.demo.walkthrough.controller.Detail"
    xmlns="sap.m"
    xmlns:mvc="sap.ui.core.mvc">
    <Page
        id="page"
        title="{i18n>TituloDetalles}"
        showNavButton="true"
        navButtonPress=".onNavBack">
        <ObjectHeader
            title="Introduzca sus nuevos datos, por favor."/>
                <Text text="{i18n>TituloNombre}"/>
                <Input
                    value="{usuarios>Nombre}"/>
                <Text text="{i18n>TituloApellidos}"/>
                <Input
                    value= "{usuarios>Apellidos}"/>
                <ObjectNumber number="{i18n>TituloTelefono}" emphasized="false"/>
                <Input
                    value= "{usuarios>Telefono}"/>
                <Text text="{i18n>TituloCorreo}"/>
                <Input
                    type="Email"
                    value= "{usuarios>Correo}"/>
                <Text text="{i18n>TituloFecha}"/>
                <Input
                    type="Date"
                    value= "{usuarios>FechaNacimiento}"/>
                <Button
                    text="{i18n>BotonGuardar}"
                    press=".onSave"/>
                <Button
                    text="{i18n>BotonCancelar}"
                    press=".onNavBack"/>
    </Page>
</mvc:View>

Detail.controller.js(第二个视图的控制器):


sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "sap/ui/core/routing/History"
], function (Controller, History) {
    "use strict";

    return Controller.extend("sap.ui.demo.walkthrough.controller.Detail", {
        onInit: function() {
            var oRouter = this.getOwnerComponent().getRouter();
            oRouter.getRoute("detail").attachPatternMatched(this._onObjectMatched, this);
        },
        _onObjectMatched: function (oEvent) {
            this.getView().bindElement({
                path: "/" + window.decodeURIComponent(oEvent.getParameter("arguments").rutaUsuarios),
                model: "usuarios"
            });
        },
        
        onNavBack: function () {
            var oHistory = History.getInstance();
            var sPreviousHash = oHistory.getPreviousHash();

            if (sPreviousHash !== undefined) {
                window.history.go(-1);
            } else {
                var oRouter = this.getOwnerComponent().getRouter();
                oRouter.navTo("overview", {}, true);
            }
        },
        onSave: function(){
            
        }
    
    });
});

初始化相关模型。

在您的 XML 视图 (Detail.view.xml) 中使用 newUser 模型:

<mvc:View
    controllerName="sap.ui.demo.walkthrough.controller.Detail"
    xmlns="sap.m"
    xmlns:mvc="sap.ui.core.mvc">
    <Page
        id="page"
        title="{i18n>TituloDetalles}"
        showNavButton="true"
        navButtonPress=".onNavBack">
        <ObjectHeader
            title="Introduzca sus nuevos datos, por favor."/>
                <Text text="{i18n>TituloNombre}"/>
                <Input placeholder="Insert Number"
                       value="{newUser>Nombre}"/>
                <Text text="{i18n>TituloApellidos}"/>
                <Input
                    value= "{newUser>Apellidos}"/>
                <ObjectNumber number="{i18n>TituloTelefono}" emphasized="false"/>
                <Input
                    value= "{newUser>Telefono}"/>
                <Text text="{i18n>TituloCorreo}"/>
                <Input
                    type="Email"
                    value= "{newUser>Correo}"/>
                <Text text="{i18n>TituloFecha}"/>
                <Input
                    type="Date"
                    value= "{newUser>FechaNacimiento}"/>
                <Button
                    text="{i18n>BotonGuardar}"
                    press=".onSave"/>
                <Button
                    text="{i18n>BotonCancelar}"
                    press=".onNavBack"/>
    </Page>
</mvc:View>

在你的Detail.controller.js中:

onSave: function(){
    var newUser = this.getView().getModel("newUser").getProperty("/");
    var users = this.getView().getModel("usuarios").getProperty("/");
    users.push(newUser);
    this.getView().getModel("usuarios").setProperty("/", users);
}

这是对您的问题的另一种看法。

您正在寻找的是脏状态...我认为 JSONModel 没有这种能力。但是你可以自己模拟。

        _onObjectMatched: function (oEvent) {
            this.route = "/" + window.decodeURIComponent(oEvent.getParameter("arguments").rutaUsuarios);
            this.getView().bindElement({
                path: this.route,
                model: "usuarios"
            });
            this.oOldData = JSON.parse(JSON.stringify(this.getView().getModel("usuarios").getProperty(this.route)));
        },
        
        onNavBack: function (oEvent) {
            
            // Check if it's dirty
            if (this.oOldData !== this.getView().getModel("usuarios").getProperty(this.route)) {
                this.getView().getModel("usuarios").setProperty(this.route, this.oOldData);
            }
            
            var oHistory = History.getInstance();
            var sPreviousHash = oHistory.getPreviousHash();

            if (sPreviousHash !== undefined) {
                window.history.go(-1);
            } else {
                var oRouter = this.getOwnerComponent().getRouter();
                oRouter.navTo("overview", {}, true);
            }
        },
        onSave: function(){
            this.oOldData = JSON.parse(JSON.stringify(this.getView().getModel("usuarios").getProperty(this.route)));
            debugger
        }

事实上,如果你想更有礼貌,你可以放一个确认对话框,确认后,还原数据并return返回,否则不要导航。