(JS) Пользовательское, наследуемое пространство имен для контроллеров вызовов в MVC - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я пытаюсь сосредоточиться на создании пространства имен JavaScript для организации наших файлов JS, которое можно использовать для доступа к определенным методам, которые позволяют вызывать методы из контроллеров MVC. Моя путаница связана с пространством имен и наследованием или применением пространства имен, когда оно вызывается из другого источника.

Пространство имен TEST.js

var TEST = TEST || {}; // Needed?
(function() {
    if (typeof String.prototype.trimLeft !== "function") {
        String.prototype.trimLeft = function () {
            return this.replace(/^\s+/, "");
        };
    }
    if (typeof String.prototype.trimRight !== "function") {
        String.prototype.trimRight = function () {
            return this.replace(/\s+$/, "");
        };
    }
    if (typeof Array.prototype.map !== "function") {
        Array.prototype.map = function (callback, thisArg) {
            for (var i = 0, n = this.length, a = []; i < n; i++) {
                if (i in this) a[i] = callback.call(thisArg, this[i]);
            }
            return a;
        };
    }

this.Settings = {
    Timer: 300
};

this.Service = (name, isApi) => {
    let location = isApi === true ? "~/Controller/api/" + name : "~/Controller/" + name;

    this.Call = (data, method, type, callback) => {
        let method = location + "/" + method + ".cs";
        let data = typeof data === "object" ? data : {};
        let type = type || "GET";

        callback = fetch(method, {
            method: type,
            headers: {
                "Accept": "application/json, text/plain, */*",
                "Content-Type": "application/json"
            },
            body: JSON.stringify(data)
        })
            .then((res) => res.json())
            .then((data) => console.log(data));

        return callback;
    };
};

this.Functions = {
    PageWidth: function () {
        // return parseInt main container css width
    },
    setCookie: function (name, value) {
        var val = value + ";domain=" + window.location.host + ";path=/;";
        document.cookie = name + "=" + val;
    },
    deleteCookie: (name) => { document.cookie = name + "=null;domain=" + window.location.host + ";path=/;expires=Thu, 01 Jan 1900 00:00:00 GMT;"; },
    getCookie: (name) => { getCookies()[name]; },
    getCookies: () => {
        var c = document.cookie, v = 0, cookies = {};

        if (document.cookie.match(/^\s*\$Version=(?:"1"|1);\s*(.*)/)) {
            c = RegExp.$1;
            v = 1;
        }

        if (v === 0) {
            c.split(/[,;]/).map(function (cookie) {
                var parts = cookie.split(/=/, 2),
                    name = decodeURIComponent(parts[0].trimLeft()),
                    value = parts.length > 1 ? decodeURIComponent(parts[1].trimRight()) : null;
                cookies[name] = value;
            });
        } else {
            c.match(/(?:^|\s+)([!#$%&'*+\-.0-9A-Z^`a-z|~]+)=([!#$%&'*+\-.0-9A-Z^`a-z|~]*|"(?:[\x20-\x7E\x80\xFF]|\\[\x00-\x7F])*")(?=\s*[,;]|$)/g).map(function ($0, $1) {
                var name = $0,
                    value = $1.charAt(0) === '"'
                        ? $1.substr(1, -1).replace(/\\(.)/g, "$1")
                        : $1;
                cookies[name] = value;
            });
        }
        return cookies;
    },
    getQSParams: (query) => {
        query
            ? (/^[?#]/.test(query) ? query.slice(1) : query)
                .split('&')
                .reduce((params, param) => {
                    let [key, value] = param.split('=');
                    params[key] = value ? decodeURIComponent(value.replace(/\+/g, ' ')) : '';
                    return params;
                }, {}
                )
            : {}
    }
}
this.ClientState = {};
this.getWidth = function () {
    return Math.max(
        document.body.scrollWidth,
        document.documentElement.scrollWidth,
        document.body.offsetWidth,
        document.documentelement.offsetWidth,
        document.documentElement.clientWidth
    );
}
this.getHeight = function () {
    return Math.max(
        document.body.scrollHeight,
        document.documentElement.scrollHeight,
        document.body.offsetHeight,
        document.documentElement.offsetHeight,
        document.documentElement.clientHeight
    );
}
}).apply(ELITE); // Var up top go here instead?

И мой тестовый код, чтобы проверить, работает ли он:

<script type="text/javascript" src='<%=ResolveUrl("~/Content/Scripts/TEST.js") %>'></script>
<script type="text/javascript">
    $(function () {
        var test = new TEST.Service("TestController", true);
        var data = {};
        test.Call(data, "TestMethod", "GET", function (resp) {
            console.log(resp);
        });
    }(TEST));
</script>

Я уверен, что это что-то простое или путаница.

Вопрос: Правильно ли указано пространство имен файла JS, который будет наследоваться другими файлами JS, или вызовами сценариев JS для вызова методов контроллера MVC?

Бонус: лучше бы это было исполнить как класс? У меня есть доступ к использованию ES5 / ES6 и, конечно, jQuery будет минимизирован с помощью этого файла TEST.js!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...