我目前正在利用Google Maps Places API为WordPress插件Ninja Forms构建一个自定义的places autocomplete字段。Ninja Forms使用backbone.js和Marionette来监听、触发和渲染各种事件等
所以,我不想再重复那些没有用的东西了,我将包括我目前的工作和我想要的变量被定义和未定义的各个地方。我觉得从根本上说这是一个javascript问题,但是,我已经使用了书中我能使用的所有技巧来让事情工作,e.g.,var self = this;
。要完全复制我的情况是非常困难的,但是我相信带有id
属性addressAutoComplete
的输入字段的HTML可能足以实现这一点。
'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
......我希望有一个JSMaven可以说,“你需要做的就是这个......"。希望如此!:D
其他想法:我不认为我可以使用ES6语法。我在想我也许可以使用箭头函数=>
??
1条答案
按热度按时间hl0ma9xz1#
您正在执行
console.log(this.formattedAddress); // Undefined
,然后才触发place_changed
回呼(设定this.formattedAddress
)。直到
keyup
或blur
发生,这会设置place_changed
事件侦听器,然后当place_changed
事件实际触发时,才会发生绑定。在此之前,它是未定义的。这就是你在控制台中看到的。
如果你把
console.log(this.formattedAddress);
移到回调函数里面,你会看到绑定确实发生了。顺便说一句,看起来你在一个事件侦听器中添加了事件侦听器,而没有进行任何清理,这是非常邪恶的。每次发生
keyup
或blur
时,你都在添加新的事件侦听器,这些侦听器对自动完成执行同样的操作。