2016-10-13 2 views
-1

Это мои параметры плагина Jquery до сих пор:JQuery расширения() в простираться()

function lightbox(options) 
{ 
// setting default parameters 
var params = $.extend(
{ 

    // show/hide & enable/disable options 
    keyNav : true,      // boolean 
    objClickNav: false,     // boolean 
    showNav : true,      // boolean 
    showTitle : true,     // boolean 
    showPagination : true,    // boolean 
    debugMode : false,     // boolean 
    disableScrolling : true,   // boolean 
    fullscreen : false,     // boolean 

    autoScale : true,     // boolean 
    staticHeight: 'auto',    // integer or 'auto' 
    staticWidth: 'auto',    // integer or 'auto' 

    // content options 
    contentType : 'image',    // defines the type of content shown in the lightbox 
             // options: 'image' 
    animationType : 'default',   // defines the type of animation when switching objects 
             // options: 'default', 'slide' 

}, options); 
} 

я не мог найти ответ в любом месте в Интернете, так вот почему я спрашиваю его здесь. Я хочу, чтобы иметь extend() внутри текущего extend(), так что я могу объявить свой плагин, как это:

lightbox({ 
    keyNav : true, 
    showNav : false, 
    scale({ 
    autoScale : false, 
    staticHeight : 800, 
    }) 
    content({ 
    contentType : 'image', 
    animationType : 'slide', 
    }) 
}); 

Что такое правильный способ сделать это?

+1

Вы должны создать объекты установки по умолчанию с той же структурой, что и параметры, переданные в плагин, тогда вы можете просто «$ .extend» его. Теперь у вас есть плоский объект по умолчанию, а затем вдруг вводится вложенный объект, у вас будет много проблем с повторением и выяснением того, что происходит, вместо того, чтобы просто сделать их одинаковой структурой для Начать с. – adeneo

+0

Может быть, вы могли бы объяснить на примере? –

ответ

1

$.extend документы a deep флаг. scale и context, как правило, были объектами, которые должен был указывать глубокий флаг extend для клонирования.

Также обратите внимание, что первая запись должна быть объектом расширения, которой вы обычно не являетесь , а не хотите быть объектом по умолчанию. (Хотя в вашем случае, вы воссоздавать по умолчанию каждый раз, так что это нормально.)

Итак:

var params = $.extend(
    true, // <=== The `deep` flag 
    {}, // <=== The new object that will be stored in `params` 
    {/*...your big defaults object...*/}, 
    options 
); 

Простой пример:

(function($) { 
 
    var fooDefaults = { 
 
    text: "coolness", 
 
    style: { 
 
     color: "green", 
 
     fontWeight: "bold" 
 
    } 
 
    }; 
 
    
 
    $.fn.foo = function(options) { 
 
    var params = $.extend(true, {}, fooDefaults, options); 
 
    this.data("params", params); // Just so we can look at them 
 
    return this.each(function() { 
 
     $(this).text(params.text).css(params.style); 
 
    }); 
 
    }; 
 
    
 
})(jQuery); 
 

 
var a = $("#a"); 
 
var b = $("#b"); 
 
a.foo({text: "I'm a"}); 
 
b.foo({style: {color: "blue"}}); 
 
console.log("a's text: " + a.data("params").text); 
 
console.log("a's color: " + a.data("params").style.color); 
 
console.log("b's text: " + b.data("params").text); 
 
console.log("b's color: " + b.data("params").style.color);
<div id="a"></div> 
 
<div id="b"></div> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Смежные вопросы