不能从导入的文件中使用另一个函数?

时间:2018-04-18 14:21:06

标签: javascript jquery sapui5

处理sapui5客户端应用。我尝试使用位于控制器js文件中的另一个函数中的一个公共js文件中的函数,但是我收到错误"不是函数"。

控制器文件 - >控制器/ controller.js

sap.ui.define([
    "path/js/error"
], function(JSONModel) {
    "use strict";

    onInit: function() {
        var type="servidor";
        var oModelServidores = new sap.ui.model.json.JSONModel();
        oDataModel.read('/ServersSet', {
            async: false,
            success: function(data) {
               //do something
            },
            error: function(type, err) {
                errHandler(type,err);  //here I'm getting the error
            }
        });
}
});

js文件在哪里是我想在控制器中使用的函数 - > JS / error.js

function errHandler(type, err){
    var ErrorResponse = err.responseText;
    var ErrorResponseBody = JSON.parse(err.responseText);
    var msgError = ErrorResponseBody.error.message.value;

    switch(type) {
        case 'servidor':
            console.log('Ups! se ha producido un error a nivel de servidor: ' + msgError);
            break;
            default:
                console.log('Se ha producido un error inesperado');
    }
}

知道为什么会遇到这个问题?

2 个答案:

答案 0 :(得分:0)

define是一个AMD约定,看起来你正在处理AMD模块。您应该了解AMD的工作原理。 require.js是AMD的一个实现。

代码

sap.ui.define(["path/js/error"], function (JSONModel) {...}

表示:"在path/js/error加载文件,并将其返回的内容填充到变量JSONModel

您编写代码的方式意味着JSONModel是包含函数errHandler的引用(如果这是由path/js/error定义的)或具有包含errHandler的属性。

所以,你的代码看起来应该是这样的:

<强>控制器/ controller.js

sap.ui.define([
    "path/js/error"
], function (JSONModel) { // This is where the module defined by path/js/error is stored
    "use strict";

    onInit: function () {
        var type = "servidor";
        var oModelServidores = new sap.ui.model.json.JSONModel();
        oDataModel.read('/ServersSet', {
            async: false,
            success: function (data) {
                //do something
            },
            error: function (type, err) {
                // Use the errHandler function of the dependency
                JSONModel(type, err);
                // or if errHandler is attached to an object that is returned
                JSONModel.errHandler(type, err)
            }
        });
    }
});

<强>路径/ JS / error.js

define([], function () {
    return function errHandler(type, err) {
        var ErrorResponse = err.responseText;
        var ErrorResponseBody = JSON.parse(err.responseText);
        var msgError = ErrorResponseBody.error.message.value;

        switch (type) {
            case 'servidor':
                console.log('Ups! se ha producido un error a nivel de servidor: ' + msgError);
                break;
            default:
                console.log('Se ha producido un error inesperado');
        }
    }
});

答案 1 :(得分:0)

你应该在开头导入js文件并给它一个句柄。 您的代码应如下所示:

    sap.ui.define([
        "path/js/error",
        "sap/ui/model/json/JSONModel"
    ], function (Error, JSONModel) {...
...
      var oModelServidores = new JSONModel(); <-- note
...
      Error.errHandler(type, err)   <- you could call the handle to the js file something else

确保js文件位于您指定的相对路径