0

我最近遇到了一種情況,我想在基本級別更改Bootstrap的默認行爲。我想自定義方法添加到Modal類,以自定義的方法可以被稱爲像任何其他股票Modal方法:將自定義函數添加到Bootstrap.js

$('#my-modal').modal('myMethod', myParameter); 

我必須通過向Modal的構造函數這個工作:

$.fn.modal.Constructor.prototype.myMethod = function (myParameter) { 
    ... 
} 

然而,myParameter變量沒有被傳遞。如何訪問/將myParameter傳遞給自定義Bootstrap方法?

回答

0

我找到了一種方法來做到這一點,但不幸的是它涉及Bootstrap源代碼的更改。的代碼段完成實際方法調用是這樣的:

$.fn.modal = function (option) { 
    return this.each(function() { 
    var $this = $(this) 
     , data = $this.data('modal') 
     , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) 
    if (!data) $this.data('modal', (data = new Modal(this, options))) 
    if (typeof option == 'string') data[option]() 
    else if (options.show) data.show() 
    }) 
} 

爲了改變這種情況,第7行(在source code線206)應該被修飾以通過最初傳遞給封閉函數的任何其他參數。另外,必須將原始參數賦予jQuery的.each()函數的每個迭代。這裏的工作代碼:

$.fn.modal = function (option) { 
    return this.each(function() { 
    var $this = $(this) 
     , data = $this.data('modal') 
     , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) 
    if (!data) $this.data('modal', (data = new Modal(this, options))) 
    if (typeof option == 'string') data[option].apply($this.data('modal'), Array.prototype.slice.call(arguments, 1)); // pass the parameters on 
    else if (options.show) data.show() 
    }, arguments) // execute each iteration with the original parameters 
} 

我仍然在嘗試,以確保這種變化不會產生任何不良的副作用,但到目前爲止,一切正常。任何更優雅的解決方案將受到歡迎。

0

你沒有辦法這樣做。 The code模型用於調用函數不考慮參數;

$.fn.modal = function (option) { 
    return this.each(function() { 
     var $this = $(this) 
     , data = $this.data('modal') 
     , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) 
     if (!data) $this.data('modal', (data = new Modal(this, options))) 
     if (typeof option == 'string') data[option]() // <-- here 
     else if (options.show) data.show() 
    }) 
    } 

你最好的選擇將是一個方法添加到$.fn,然後通過$(this).data('modal')檢索Model實例,因爲這是在那裏引導存儲實例;

$.fn.foo = function (param) { 
    return this.each(function() { 
     var model = $(this).data('modal'); 

     // blah blah blah 
    }); 
}