在函数中设置全局变量的值

时间:2017-04-30 17:17:13

标签: javascript sapui5 sap-fiori

我目前正在使用消耗OData服务的SAP Fiori app

我在我的控制器fonct中创建了一个方法,用于计算来自我的OData的变量。

我想捕获这个值,并在每次刷新视图时将其放在一个全局变量中。

我创建了一个这样的全局变量:

var boo1;
return Controller.extend("com.controller.Detail", {...});

我在boo1方法中的方法fonct中将onInit作为参数传递,但它是undefined

以下是我的控制器代码的片段:

sap.ui.define([
    "com/util/Controller"
], function(Controller) {
    "use strict";

    var boo1;
    return Controller.extend("com.controller.Detail", {
        onInit: function() {
            this.fonct(boo1);
            alert(boo1);
        },          

        fonct: function(ovar) {
            var that = this;
            var oModel = that.getView().getModel();
            oModel.read("/alertSet", {
                success: function(data) {
                    var a = JSON.stringify(data);
                    var b = a.slice(332,-4);
                    ovar = b;
                }
            });
        }

    });
});

3 个答案:

答案 0 :(得分:1)

避免定义全局变量(例如在sap.ui.define之前),特别是如果您正在处理将要放入Fiori Launchpad的应用程序。这种方法是considered harmful。文档中也重复了这一点:

  

在控件和类模块中,你应该使用全局变量。(src)

我们故意使用"use strict"来禁止此类行为。

此外,在sap.ui.getCore()上定义属性或添加模型是Fiori应用程序的反模式。这不仅会导致与定义全局变量相同的缺陷,而且默认情况下会在核心are not propagated to the views 上设置模型,因为组件是模块化使用的。因此,将此类数据定义到相应的组件而不是核心是Fiori应用程序的方法。

==>的 FLP Best Practices

  

我创建了一个全局变量

var boo1;
return Controller.extend("com.controller.Detail", {...});

您创建的内容不是全局变量,因为boo1是在匿名函数中声明的。相反,boo1存储在closure中,允许原型方法(onInitfonc)维护boo1无法访问的词汇环境只有方法,但也有com.controller.Detail的其他实例。就Java而言,我们可以说boo1是一个私有静态变量。但它不是一个全局变量。

那就是说..

  

我在boo1方法中的方法fonct中将onInit作为参数传递,但它是undefined

闭包使得传递boo1作为参数是不必要的(除非你想要boo1的硬拷贝来维护它的多个状态)。方法fonct可以直接访问boo1,即使在fonct中定义的匿名回调中也是如此。

现在,您可能会问为什么boo1undefined。有两个原因:

    在致电boo1之前,
  1. undefinedfonct。如果boo1是一个对象而不是未定义的,那么ovar将是boo1对象的引用,并且对ovar属性的更改将发生在{ {1}}对象。但是boo1不是一个对象。因此undefined根本不知道ovar是什么。 注意: JS的评估策略是" Call by object-sharing"。
  2. boo1在致电alert(boo1)后立即被解雇。除非fonct同步工作(我强烈建议这样做),否则浏览器不会等待成功回调被触发以调用oModel后来。警报立即触发,然后成功回调,alert(boo1)应该被操纵。
  3. 删除boo1并使用ovar代替在成功回调中正确更新boo1

    boo1

答案 1 :(得分:0)

我认为你想做的事情比你正在做的更简单。 要保存全局变量,请获取Core对象并将变量设置为此对象的新属性:

sap.ui.getCore() .myGlobalVar = myCalculatedValue;

然后在其他视图中使用它,直接从Core获取属性:

var mySavedVar = sap.ui.getCore() .myGlobalVar

然后使用Router routeMatched事件处理导航并刷新值。

这是一个片段:https://jsbin.com/bewigusopo/edit?html,output

import { connect } from 'react-redux';

import { toJS } from './to-js';

import DumbComponent from './dumb.component';

const mapStateToProps = (state) => {
   return {
       /**
       obj is an Immutable object in Smart Component, but it’s converted to a plain 
       JavaScript object by toJS, and so passed to DumbComponent as a pure JavaScript 
       object. Because it’s still an Immutable.JS object here in mapStateToProps, though, 
       there is no issue with errant re-renderings.
       */
       obj: getImmutableObjectFromStateTree(state)
   }
};

export default connect(mapStateToProps)(toJS(DumbComponent));

其他可能性是设置一个全局模型,它将简化你的绑定。只需创建它并将其设置为Core

    <!DOCTYPE html>
<html><head>
    <meta http-equiv='X-UA-Compatible' content='IE=edge' >
    <meta charset="UTF-8" >
    <title>test</title>

    <script id='sap-ui-bootstrap'
            src='https://sapui5.hana.ondemand.com/1.38.5/resources/sap-ui-core.js'
        data-sap-ui-theme='sap_bluecrystal'
        data-sap-ui-bindingSyntax="complex"></script>

    <script id="view1" type="sapui5/xmlview">
        <mvc:View xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc">
            <core:ComponentContainer name='my.comp'/>
        </mvc:View>
    </script>

    <script id="home" type="sapui5/xmlview">
        <mvc:View xmlns="sap.m" xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc"
            controllerName="my.controller1">
            <Page>
                <Input id="input" placeholder="Write a text to save it globally"/>
                <Button text="Navigate to other view" press="onNavigate"/>
            </Page>
        </mvc:View>
    </script>

    <script id="add" type="sapui5/xmlview">
        <mvc:View xmlns="sap.m" xmlns:f="sap.ui.layout.form" xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc"
            controllerName="my.controller2">
            <Page id="page" showNavButton="true" navButtonPress="onBack">
              <HBox class="sapUiLargeMarginBegin">
                 <Label text="The global variable is:" class="sapUiSmallMarginEnd sapUiSmallMarginTop"/>
                 <Input id="inputResult"/>
              </HBox>
            </Page>
        </mvc:View>
    </script>

    <script>
        // jQuery.sap.declare("my.comp.Component");
        sap.ui.define("my/comp/Component", ["sap/ui/core/UIComponent"], function(UIComponent) {
            return UIComponent.extend("my.comp.Component", {
                metadata : {
                    name : "GreatComponent",
                    version : "1.0",
                    includes : [],
                    dependencies : {
                        libs : ["sap.m"]
                    },
                    routing: {
                        config: {
                            routerClass: "sap.m.routing.Router",
                            viewType: "XML",
                            viewPath: "my",
                            controlId: "app",
                            transition: "slide",
                            controlAggregation: "pages"
                        },
                        routes: [
                            {
                                name: "home",
                                pattern: "",
                                target: "home"
                            },
                            {
                                name: "add",
                                pattern: "add",
                                target: "add"
                            }
                        ],
                        targets: {
                            home: {
                                viewName: "Home",
                                title: "home"
                            },
                            add: {
                                viewName: "Add",
                                title: "add"
                            }
                        }
                    }
                },
                init: function() {
                    sap.ui.core.UIComponent.prototype.init.apply(this, arguments);
                    var oRouter = this.getRouter();
                    var oViews = oRouter.getViews();
                    this.runAsOwner(function() {
                        var myHome = sap.ui.xmlview({viewContent:jQuery('#home').html()});
                        oViews.setView("my.Home", myHome);
                        var myAdd = sap.ui.xmlview({viewContent:jQuery('#add').html()});
                        oViews.setView("my.Add", myAdd);
                    });
                    oRouter.initialize();
                },
                createContent : function() {
                    var componentData = this.getComponentData();
                    return new sap.m.App("app", {
                    });
                }
            });
        });

        sap.ui.define("my/controller1", [
          "sap/ui/core/UIComponent"
        ],function(UIComponent) {
            return sap.ui.controller("my.controller1", {
                onInit: function() {
                    this.oRouter = UIComponent.getRouterFor(this.getView());
                },

                onNavigate: function() {
                    var sInputText = this.getView().byId("input").getValue();
                    sap.ui.getCore().myGlobalVar = sInputText;     
                    console.log(sap.ui.getCore().myGlobalVar)

                    this.oRouter.navTo("add");
                }
            });
        });

        sap.ui.define("my/controller2", [
          "sap/ui/core/UIComponent"
        ],function(UIComponent) {
            return sap.ui.controller("my.controller2", {
                onInit: function() {
                    this.oRouter = UIComponent.getRouterFor(this.getView());

                    this.oRouter.getRoute("add").attachPatternMatched(this._onObjectMatched, this);
                },

                _onObjectMatched: function(){
                    var sGlobalVariable = sap.ui.getCore().myGlobalVar;
                    console.log(sGlobalVariable);
                    this.getView().byId("inputResult").setValue(sGlobalVariable);
                },

                onBack: function(){
                    this.oRouter.navTo("home");
                }
            });
        });
        sap.ui.require(["my/comp/Component"], function(myComp) {
            // instantiate the View
            sap.ui.xmlview({viewContent:jQuery('#view1').html()}).placeAt('content');
        });
    </script>

</head>
<body class='sapUiBody'>
    <div id='content'></div>
</body>
</html>

答案 2 :(得分:-1)

您应该在全局范围内声明全局变量(即sap.ui.define之前)。