将此.getPlace()绑定到自动完成将对象放置在backbone.js和Marionette中的问题

7d7tgy0s  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(147)

我目前正在利用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语法。我在想我也许可以使用箭头函数=>??

hl0ma9xz

hl0ma9xz1#

您正在执行console.log(this.formattedAddress); // Undefined,然后才触发place_changed回呼(设定this.formattedAddress)。
直到keyupblur发生,这会设置place_changed事件侦听器,然后当place_changed事件实际触发时,才会发生绑定。
在此之前,它是未定义的。这就是你在控制台中看到的。
如果你把console.log(this.formattedAddress);移到回调函数里面,你会看到绑定确实发生了。
顺便说一句,看起来你在一个事件侦听器中添加了事件侦听器,而没有进行任何清理,这是非常邪恶的。每次发生keyupblur时,你都在添加新的事件侦听器,这些侦听器对自动完成执行同样的操作。

相关问题