如何组织每个视图的JavaScript代码?

时间:2012-09-19 15:55:33

标签: javascript asp.net-web-api

我正在开发一个项目,该项目使用mvc 4 api和vanilla mvc 4进行路由和视图。因为我们正在使用web api \ json,所有数据调用都是客户端驱动的,所以我们创建了很多javascript代码。

为了帮助解决这个问题,我们决定创建一个全局原型javascript对象来处理共享的东西,并在每个视图中包含一个javascript文件来处理该特定视图的所有客户端代码。 (我知道这不是最佳的)

我的问题是每个视图的javascript文件。我们应该为每个视图创建一个原型对象,还是使用闭包?

如果没有每个视图的对象,我们会看到一个趋势,我们通常最终得到一个$(文档).ready,事件连线如$(document).on('click',...,view models,and a一堆旧的学校功能。看起来应该有一种方法可以将这些区域组织成更好的东西。我已经看到了关于如何这样做的一些建议,但他们没有展示如何结合jQuery负载,事件线ups,查看模型。有没有人有任何建议,或者可能是一个简单的例子?

以下是我们通常最终的区域

$(document).ready(function () {....

$(document).on('click', '.button', function(e) {.....

function FooBar(){.....

2 个答案:

答案 0 :(得分:2)

我认为没有任何关于如何最好地实现这一目标的硬性规则 - 很多方法可以为这只猫提供皮肤。

但这就是我所做的:我倾向于为页面创建一个(或者更多,如果需要)闭包对象。它将有一个initialize方法,它包含$()。ready()处理程序,然后执行所有事件处理程序连接,以及需要发生的任何其他页面全局初始化。

这样的事情:

(function() {
    function Page() {
        var me = this;            

        // plain properties
        this.prop = "value";

        // compiled templates
        this.template = HandleBars.compile($("#template1").html());

        this.intialize =  function () {
            $().ready(function () {                    
                $("#button1").click( me.button1Click );
                $("#field1").change( me.field1Change );
            });
        };
        this.button1Click = function () {
            alert("click");
            me.doSomething();
        };
        this.field1Change = function () {
            alert("change");
        },
        this.doSomething = function (parm) {
            alert("doSomething");
        }
    }        
    var page = new Page();
    page.intialize();
})();

答案 1 :(得分:0)

您应该为每个视图使用一个视图模型,并使用KnockoutJs或任何其他类似的javascript库将其绑定到您的视图(html),这样可以提供类似的内容(从第一个示例中获取):

view(html):

​<html>
    <body>
        <p>First name: <input data-bind="value: firstName" /></p>
        <p>Last name: <input data-bind="value: lastName" /></p>
        <h2>Hello, <span data-bind="text: fullName"> </span>!</h2>       
    </body>
</html>​​​​​​​​​​​​​​

查看模型(javascript):

var ViewModel = function(first, last) {
    this.firstName = ko.observable(first);
    this.lastName = ko.observable(last);

    this.fullName = ko.computed(function() {
        return this.firstName() + " " + this.lastName();
    }, this);
};

从服务器获取数据,并填充视图模型(和视图,因此)

$.get('/info/path/', function(data) {
    ko.applyBindings(new ViewModel(data.Planet, data.Earth));    
});

当然,如果你的最后一部分不在页面末尾,你可以将它放在document.ready或任何类似的方法中。