带有2个或更多对象的页面上的javascript设计模式

时间:2016-04-25 10:25:51

标签: javascript oop object design-patterns

我需要选择正确的设计模式。我的页面有2个从同一个构造函数创建的对象。我遇到的问题是检测哪个对象正在获取点击事件。

我在创建对象后这样做:

$("table tr, table button,.dataTables_paginate a").click(function (e) {
    **myTableName.buttonPressed($(this));**

});

 buttonPressed: function (el) {
    if (el.is('a') && el.closest('li').hasClass('paginate_button')) {
        var objName = el.attr('aria-controls');
        debugger;
    }
    else {
        var objName = $(el).closest('table').attr('id');
    }

    **this.getName(objName);**
    tbl = myTableName.tbl;
    editor = myTableName.editor;
    //myTableName.acl(myTableName.currentForm);

},

然后

 getName: function (objName) {
    // search through the global object for a name that resolves to this object
    for (var name in window)
        if (window[name] == this) {
            if (objName) {
                myTableName = window[objName];
                //window.myState[this.myInstanceName] = jQuery.extend({}, this);
                break;
            } else {
                window[name] = this;
                window[window[name]] = window[name];
                myTableName = window[window[name]];
                // window.myState[this.myInstanceName] = jQuery.extend({}, this);
            }
            break;
        }
},

除了这些都是全局的,我不会这是正确的方法。

思想?

1 个答案:

答案 0 :(得分:0)

您似乎应该使用自定义属性。自定义属性允许您将其他相关数据存储到任何DOM元素。可以使用的一种方法是将DOM与一些JS字节码相关联。当您必须向后工作时,即在查找HTML元素的相关对象时,这尤其有用。标准说这些属性必须以data-开头(虽然从技术上讲,你可以使用浏览器不使用的任何东西,但不建议这样做)。这是一个例子:

HTML:

<table data-instance-name="name1">
    ...
    <button>Action</button>
    <a>Another action</a>
</table>
<table data-instance-name="name2">
    ...
    <button>Action</button>
    <a>Another action</a>
</table>

JS:

$( 'table button, table a' ).on('click', function() {
    var name = $(this).closest('table').attr('data-instance-name'),
        table = tables[name];
});