【问题标题】:How to extend object prototype created with anonymous function如何扩展使用匿名函数创建的对象原型
【发布时间】:2013-11-01 01:55:12
【问题描述】:

我正在使用“scrollPagination”javascript 进行 ajax 分页。 这是一个代码:

(function( $ ){
    $.fn.scrollFeedPagination = function(options) {
        var opts = $.extend($.fn.scrollFeedPagination.defaults, options);  
        var target = opts.scrollTarget;
        if (target == null){
            target = obj; 
        }
        opts.scrollTarget = target;

        return this.each(function() {
            $.fn.scrollFeedPagination.init($(this), opts);
        });
    };
    $.fn.stopScrollPagination = function(){
        return this.each(function() {
            $(this).attr('scrollPagination', 'disabled');
        });
    };
    $.fn.scrollFeedPagination.loadContent = function(obj, opts){
        console.log(opts);
        var target = opts.scrollTarget;
        var mayLoadContent = ($(target)[0].scrollHeight - $(target).scrollTop()) == $(target).height();
        if (mayLoadContent){
            if (opts.beforeLoad != null){
                opts.beforeLoad(); 
            }
            $(obj).children().attr('rel', 'loaded');
            $.ajax({
                type: 'POST',
                url: opts.contentPage,
                data: opts.contentData,
                success: function(data){
                    console.log(data);
                    console.log(1);
                    var selector = target.selector;
                    var response = $(data).find(selector).children();
                    $(obj).append(response);
                    var objectsRendered = $(obj).children('[rel!=loaded]');
                    if (opts.afterLoad != null){
                        opts.afterLoad(objectsRendered);    
                    }
                },
                dataType: 'html'
            });
        }
    };

    $.fn.scrollFeedPagination.init = function(obj, opts){
        var target = opts.scrollTarget;

        $(obj).attr('scrollPagination', 'enabled');
        $(target).scroll(function(event){
            if ($(obj).attr('scrollPagination') == 'enabled'){
                $.fn.scrollFeedPagination.loadContent(obj, opts);       
            }
            else {
                event.stopPropagation();    
            }
        });
        $.fn.scrollFeedPagination.loadContent(obj, opts);
    };
    $.fn.scrollFeedPagination.defaults = {
        'contentPage' : null,
        'contentData' : {},
        'beforeLoad': null,
        'afterLoad': null   ,
        'scrollTarget': null,
        'heightOffset': 0         
    };  
})( jQuery );

当我在一个节点上初始化它时它工作正常。 但是两个节点互相干扰:

示例:

node1.pagination({
'contentPage': ajaxurl,
    'contentData': {
         action: 'chat_pagination',
         'last_time' : last_time,
    },
    'scrollTarget': node1, 
    'beforeLoad': function() {},
    'afterLoad': function(elementsLoaded) {
        last_time = node1.children('div').last().data('last-id');
    }
});

它可以工作,但只要我初始化另一个

node2.pagination({
'contentPage': ajaxurl,
    'contentData': {
         action: 'feeds_pagination',
         'last_time' : last_time,
    },
    'scrollTarget': node2, 
    'beforeLoad': function() {},
    'afterLoad': function(elementsLoaded) {
        last_time = node2.children('div').last().data('last-id');
    }
});

现在 node1 使用 node2 的 last_time 更新,ajax 操作也“feeds_pagination”。

现在要解决这个问题,我需要两个 scrollFeedPagination() 实例; 可以用这样的语法扩展吗?

【问题讨论】:

  • 您的last_time 变量在哪里声明?这似乎是你的错,而不是图书馆的错。
  • last_time 被正确声明,为了简单起见,我只是省略了那部分。没关系,即使我发送带有“last_time2”的node2,它也会同时拥有last_timelast_time2
  • 哦,对了,我虽然你在问last_time 更新不正确。我现在看到了你的问题。

标签: javascript ajax oop prototype


【解决方案1】:
var opts = $.extend($.fn.scrollFeedPagination.defaults, options);

请注意,$.extend 的第一个参数是正在扩展的对象(具有其余参数中对象的属性),也是 returned 函数的结果。所以你基本上是在设置

var opts = $.fn.scrollFeedPagination.defaults
// extend it then:
$.extend(opts, options);

如您所见,您的两个 opts 对象实际上是相同的,第二次扩展它会覆盖第一个配置。相反,从一个新的空对象开始,先用默认值扩展它,然后用 options 参数:

var opts = $.extend({}, $.fn.scrollFeedPagination.defaults, options);

【讨论】:

  • 该死,我做不到:DI 尝试了很多变体,但从未忘记如何开始)我声明 var options 这是我在 scrollFeedPagination() 中写的所有内容,然后我做 var opts = $.extend({}, $.fn.scrollFeedPagination.defaults, options);
  • 哦,你的意思是我需要修改库?
  • 我没能做到 :( 你能用真实的例子更新你的答案吗?
  • 你所说的“真实例子”是什么意思? sn-p 与您的情况完美匹配。
  • 完美的 jsFiddle,但是,只是告诉我把这些放在哪里会很棒。对不起
猜你喜欢
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多