简体   繁体   English

带有 jQ​​uery 插件的 jQuery 对象文字或模块模式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM