Fire BarcodeScannerButton after View loads

筅森魡賤 提交于 2020-01-06 17:46:23

问题


I have implemented a scanner button on my Fiori/UI5 application. I used sap.ndc.BarcodeScannerButton and created that button on the controller (I cannot seem to create the button on my view.xml).

Anyway, I need to fire this button after the view loads. I have a master-detail application. The scanner button is on the master view ofcourse.

First thing I did was call the button itself. But my first problem is that the button does not accept an id as a parameter. It tells me that app cannot accept duplicate id. So what I did was just look for the button id. I was able to locate it (e.g. _button9) but whenever I call it via sap.ui.getCore.byId() there are times that it returns "undefined." That's why I cannot call firePress();

Another problem I have is where to put this firePress() method. I tried to put it on method onAfterRendering() assuming that again due to the undefined button I cannot call the method firePress(). I have tried putting it on other methods like after the data has been successfully called by using method attachRequestCompleted. No luck.

Below is the code

/*
 * Copyright (C) 2009-2014 SAP SE or an SAP affiliate company. All rights reserved
 */
jQuery.sap.require("sap.ca.scfld.md.controller.ScfldMasterController");
jQuery.sap.require("ui.s2p.srm.sc.create.util.Formatter");
jQuery.sap.require("sap.ndc.BarcodeScannerButton");

var counter = 0;

sap.ui.controller("ui.s2p.srm.sc.create.SRM_SC_CREExtension.view.S2Custom", {
    onInit: function() {
        sap.ca.scfld.md.controller.ScfldMasterController.prototype.onInit.call(this);
        this.oBundle = this.oApplicationFacade.getResourceBundle();
        this.isRoot = true;
        this.oRouter.attachRouteMatched(function(e) {
            if (e.getParameter("name") === "master" && !this.isRoot && Object.keys(e.getParameter("arguments")).length === 0) {
                var d = sap.ui.core.routing.History.getInstance().getDirection("shoppingCartCheckout/" + this.tempCartId);
                if (d === "Unknown") {
                    this.isRoot = true;
                    this._oControlStore.oMasterSearchField.clear()
                } else {
                    if (this.getList() !== null) {
                        var i = this.getList().getSelectedItem();
                        if (i !== null) {
                            //alert("setListGo");
                            this.setListItem(i);
                        }
                    }
                }
            }
            this.isRoot = (this.isRoot) ? false : this.isRoot;

        }, this);

        //  alert(sap.ui.getCore().byId("productScanButton"));
        this.onBarcodeScanning();
        this.setEmptyCart(true);
        this.showAllProducts(); //added by salduam to show all products
    },

    backToList: function() {
        //alert("back");
    },

    getDefaultUserSettings: function(r) {
        var o = function(D, R) {
            this.tempCartId = D.results[0].TEMP_CART_ID;
            if (!jQuery.device.is.phone) {
                if (r) {
                    this.oRouter.navTo("noData", {
                        viewTitle: "DETAIL_TITLE",
                        languageKey: "NO_ITEMS_AVAILABLE"
                    }, true)
                } else {
                    this.navToEmptyView()
                }
            }
        };
        var d = this.oApplicationFacade.getODataModel("getdefusrset");
        d.read("DefaultUserSettings?ts=" + Date.now(), null, null, true, jQuery.proxy(o, this), jQuery.proxy(this.onRequestFailed, this))
    },

    applySearchPatternToListItem: function(i, f) {

        if (f.substring(0, 1) === "#") {
            var t = f.substr(1);
            var d = i.getBindingContext().getProperty("Name").toLowerCase();
            return d.indexOf(t) === 0
        } else {
            return sap.ca.scfld.md.controller.ScfldMasterController.prototype.applySearchPatternToListItem.call(null, i, f)
        }
    },

    getHeaderFooterOptions: function() {
        var o = {
            sI18NMasterTitle: "MASTER_TITLE",
            buttonList: []
        };
        return o
    },

    isBackendSearch: function() {
        return true
    },

    //call startReadListData with parameter wildcard
    showAllProducts: function(e) {
        var startSearchText = "*";
        this.startReadListData(startSearchText);
        //alert("called");

    },

    applyBackendSearchPattern: function(f, b) {
        //added by salduam
        //if search field is blank, automatically call showAllProducts
        if (f == "") {
            this.showAllProducts()
        };

        if (f != "" && f != null) {
            this.startReadListData(f)
        } else {
            this.setEmptyCart(false)
        }
    },

    startReadListData: function(f) {

        var o = function(D, r) {
            var m = new sap.ui.model.json.JSONModel(D.results);
            this.getView().setModel(m);
            this.getList().destroyItems();
            this.getList().bindAggregation("items", {
                path: "/",
                template: this.oTemplate.clone(),
                filter: [],
                sorter: null
            });
            this.registerMasterListBind(this.getList());
        };
        var e = encodeURIComponent(f);
        //console.log("EEEE-----"+ e);
        var d = this.oApplicationFacade.getODataModel();
        //console.log(d);
        d.read("CATALOG_ITEM?$filter=startswith(description,'" + e + "')&$top=20", null, null, true, jQuery.proxy(o, this), jQuery.proxy(this.onRequestFailed,
            this));
    },

    setListItem: function(i) {
        //  alert("onClick");
        var b = i.getBindingContext();

        var m = b.oModel.oData[parseInt(b.sPath.split('/')[1])];
        this.oRouter.navTo("detail", {
            tempCartId: this.tempCartId,
            contextPath: b.getPath().substr(1)
        }, true);
        var c = sap.ui.core.Component.getOwnerIdFor(this.oView);
        var C = sap.ui.component(c);
        C.oEventBus.publish("ui.s2p.srm.sc.create", "refreshDetail", {
            data: m
        });

    },

    setEmptyCart: function(r) {

        var e = new sap.ui.model.json.JSONModel({
            results: []
        });
        this.oRouter.navTo("noData", {
            viewTitle: "DETAIL_TITLE",
            languageKey: "NO_ITEMS_AVAILABLE"
        }, true);
        this.getView().setModel(e);
        this.oTemplate = new sap.m.ObjectListItem({
            type: "{device>/listItemType}",
            title: "{matnr}",
            press: jQuery.proxy(this._handleItemPress, this),
            number: "{parts:[{path:'itm_price'},{path:'itm_currency'}],formatter:'ui.s2p.srm.sc.create.util.Formatter.formatPrice'}",
            numberUnit: "{itm_currency}",
            attributes: [new sap.m.ObjectAttribute({
                text: "{description}"
            })],
        });
        this.getList().bindAggregation("items", {
            path: "/results",
            template: this.oTemplate,
            filter: [],
            sorter: null,
        });
        this.registerMasterListBind(this.getList());
        this.getDefaultUserSettings(r)
    },

    onRequestFailed: function(e) {
        jQuery.sap.require("sap.ca.ui.message.message");
        sap.ca.ui.message.showMessageBox({
            type: sap.ca.ui.message.Type.ERROR,
            message: e.message,
            details: e.response.body
        })
    },

    onExit: function() {},

    onBarcodeScanning: function(oEvent) {
        var productScanButton = new sap.ndc.BarcodeScannerButton({
            provideFallback: "{/btnFallback}",
            width: "100%",
            scanSuccess: function(oEvent) {
                var barcodeID = oEvent.getParameter("text");
                sap.m.MessageToast.show(barcodeID);
                var searchField = sap.ui.getCore().byId("__field3");
                searchField.setValue(barcodeID);

                searchField.fireSearch();
            }
        });
        this.getView().byId("barCodeVBox").addItem(productScanButton);
    },

    onAfterRendering: function(oEvent) {},

    onBeforeRendering: function() {}

});

回答1:


For placing the fire() method. Are you trying to display a pop-up barcode reader? something similar to the pop-up of the app "SD_SO_CRE" (where customer selection dialog is load before master view). they do not solve the task with fire()...



来源:https://stackoverflow.com/questions/34720175/fire-barcodescannerbutton-after-view-loads

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!