我目前正在使用 Google Maps Places API 为 Wordpress 插件 Ninja Forms 构建自定义地点自动填充字段。Ninja Forms 使用backbone.js 和 Marionette 在各种事件之后/之前监听、触发和渲染等
因此,我将介绍我当前的工作以及我想要的变量已定义和未定义的各个地方,而不是遍历所有无效的东西。我觉得从根本上说这是一个 javascript 问题,但是,我已经使用了书中的所有技巧来让事情正常工作,例如,var self = this;
在调用事件侦听器之前。完全复制我的情况将非常困难,但我相信带有id
属性的输入字段的 HTMLaddressAutoComplete
可能足以使其工作。
'use strict';
(function ($) {
var nfRadio = Backbone.Radio;
var addressAutoCompleteFrontEndController = Marionette.Object.extend({
address: "",
formattedAddress: "",
autocompleteAddressField: {},
autocompleteOn: 0,
autocomplete: {},
initialize: function initialize() {
// On the Field's model value change...
var fieldsChannel = nfRadio.channel('fields');
this.listenTo(fieldsChannel, 'keyup:field', this.onKeyup);
this.listenTo(fieldsChannel, 'blur:field', this.onBlur);
},
onKeyup: function(model) {
var place;
this.autocompleteAddressField = document.getElementById('addressAutoComplete');
this.autocomplete = new google.maps.places.Autocomplete(this.autocompleteAddressField, {types: ['geocode']} );
this.autocompleteOn = 1;
var self = this;
this.autocomplete.addListener('place_changed', function() {
place = this.getPlace();
self.formattedAddress = place.formatted_address;
console.log(place.formatted_address); // Defined
});
console.log(this.formattedAddress); // Undefinied
},
onBlur: function(model) {
var place;
this.autocompleteAddressField = document.getElementById('addressAutoComplete');
this.autocomplete = new google.maps.places.Autocomplete(this.autocompleteAddressField, {types: ['geocode']} );
this.autocompleteOn = 1;
var self = this;
this.autocomplete.addListener('place_changed', function() {
place = this.getPlace();
self.formattedAddress = place.formatted_address;
console.log(place.formatted_address); // Defined
});
console.log(this.formattedAddress); // Undefined
}
});
$(document).ready(function () {
new addressAutoCompleteFrontEndController();
});
})(jQuery);
因此,实际上,在this.autocomplete.addListener
回调函数内部 - 我可以完全访问place.formatted_address
,这给了我用户选择的内容。但我似乎无法将它绑定到this.formattedAddress
......我希望有一个 JS 专家可以说,“你需要做的就是这个......”。希望!:D
其他想法:我认为我不能为此使用 ES6 语法。我在想我也许可以利用箭头功能=>
??