[英]jQuery object literal or module pattern with jQuery plugins
Let's say we have something like this with the jQuery select2 plugin:假设我们有这样的 jQuery select2 插件:
$(function() { $('.select2').select2({ minimumInputLength: 1, ajax: { dataType: 'json', cache: true, url: getUrl, data: getData, processResults: getProcessResults } }); function getUrl() { return 'http://beta.json-generator.com/api/json/get/4JZYSpOHM'; } function getData(params) { return { q: params.term }; } function getProcessResults(data) { return { results: data }; } });
.select2 { width: 100%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" /> <select class="select2"></select>
But we wanna use an object literal or the module pattern for the jQuery feature and plugin like this:但是我们想为 jQuery 功能和插件使用对象文字或模块模式,如下所示:
var myAjax = { init: function() { var _this = this; $('.select2').select2({ minimumInputLength: 1, ajax: { dataType: 'json', cache: true, url: _this.getUrl, data: _this.getData, processResults: _this.getProcessResults } }); }, getUrl: function() { return 'http://beta.json-generator.com/api/json/get/4JZYSpOHM'; }, getData: function(params) { return { q: params.term }; }, getProcessResults: function(data) { return { results: data }; } }; $(document).ready(myAjax.init);
.select2 { width: 100%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" /> <select class="select2"></select>
How can we do that?我们怎么做?
Sources:资料来源:
https://learn.jquery.com/code-organization/concepts/ https://learn.jquery.com/code-organization/concepts/
https://select2.github.io/examples.html#data-ajax https://select2.github.io/examples.html#data-ajax
The issue you have is that this
within the init
function will refer to the document
, as you run it under the document.ready handler.您遇到的问题是
init
函数中的this
将引用document
,因为您在 document.ready 处理程序下运行它。 To fix this you can use the myAjax
variable directly to call its properties and methods.要解决此问题,您可以直接使用
myAjax
变量来调用其属性和方法。 Try this:尝试这个:
var myAjax = { init: function() { $('.select2').select2({ minimumInputLength: 1, ajax: { dataType: 'json', cache: true, url: myAjax.getUrl(), data: myAjax.getData, processResults: myAjax.getProcessResults } }); }, getUrl: function() { return 'http://beta.json-generator.com/api/json/get/4JZYSpOHM'; }, getData: function(params) { return { q: params.term }; }, getProcessResults: function(data) { return { results: data }; } }; $(document).ready(myAjax.init);
.select2 { width: 100%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" /> <select class="select2"></select>
I'd also suggest you change the name of the object as myAjax
isn't very semantic given its purpose.我还建议您更改对象的名称,因为
myAjax
的目的,它的语义不是很myAjax
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.