(JS格式)自定义、可继承的命名空间,用于在 MVC 中调用控制器

(JS) Custom, inheritable, namespace to call controllers in MVC

提问人:Doodely 提问时间:9/8/2018 最后编辑:Doodely 更新时间:9/8/2018 访问量:24

问:

我目前正在尝试创建一个用于组织 JS 文件的 JavaScript 命名空间,该命名空间可用于访问允许从 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文件缩小!

JavaScript jQuery ASP.NET-MVC 命名空间

评论

1赞 dandavis 9/8/2018
如果不使用模块,则需要在定义中设置。在包装函数上使用是最简单的方法,因为它避免了接触现有代码。thisnew
0赞 Doodely 9/8/2018
哦?请举个例子,我真的很好奇。另外,这种方法看起来是否可行,我正在尝试采用,或者你认为它容易出现我可能忽略的更大问题?谢谢!
0赞 dandavis 9/8/2018
实际上,您已经掌握了 的方法,所以应该是 。我不确定两者的定义在哪里。或者您可以更改为 .这有点非常规的模式,但并没有错。类可能更具可读性或可维护性。此外,它还可以为您提供很大的灵活性,以支付少量的一次性(启动)开销。ELITETEST.ServiceELITE.Service.apply(ELITE).apply(TEST)Object.assign
0赞 Doodely 9/8/2018
我本来想早点输入 TEST,为了清楚起见,我已经编辑了答案和代码。我遇到的问题是编译,当我加载此页面时,它找不到 TEST。它也找不到名为“Services”的 TEST 构造函数。虽然我以为绑定这个。服务将允许它被调用和使用。修正?

答: 暂无答案