Доступ к родительскому свойству в обратном вызове jQuery

Не уверены, правильно ли я сформулировал это, но как мне указать в обратном вызове ссылку на свойство control базового класса?

Это беспокоит меня в течение некоторого времени, и я обычно работаю над этим, но я был бы благодарен, если бы кто-нибудь мог просветить меня о том, как я должен это делать правильно.

var base = function() {
    var controls = {};

    return {
        init: function(c) {
            this.controls = c
        },
        foo: function(args) {
            this.init(args.controls);
            $(this.controls.DropDown).change(function() {
                $(this.controls.PlaceHolder).toggle();
            });
        }
    }
};

Весьма признателен,

Павел

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
3 285
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Здесь вам нужно использовать закрытие.

var base = function() {
var controls = {};

return {
    init: function(c) {
            this.controls = c
    },
    foo: function(args) {
            this.init(args.controls);
            $(this.controls.DropDown).change(function(controls) {
                    return function(){
                        $(controls.PlaceHolder).toggle();
                    }
            }(this.controls));
    }
}

};

Побей меня на мгновение более элегантным решением: D

Damir Zekić 31.10.2008 20:11

Когда я использую этот подход, кажется, происходит что-то странное. Событие щелчка запускается при загрузке страницы. Я думаю, что это связано с параметром управления в функции обратного вызова, потому что, когда я удаляю это событие, событие щелчка не запускается автоматически.

bitsprint 31.10.2008 23:14
Ответ принят как подходящий

Используйте силу закрытия:

var base = function() {
    var controls = {};

    return {
        init: function(c) {
                this.controls = c
        },
        foo: function(args) {
                var self = this;

                this.init(args.controls);
                $(this.controls.DropDown).change(function() {
                        $(self.controls.PlaceHolder).toggle();
                });
        }
    }
};

Хотя закрытие - это предпочтительный, вы также можете использовать jquery bind для передачи объекта:

var base = function() {
    var controls = {};

    return {
        init: function(c) {
            this.controls = c
        },
        foo: function(args) {
            this.init(args.controls);
            $(this.controls.DropDown).bind('change', {controls: this.controls}, function(event) {
                $(event.data.controls.PlaceHolder).toggle();
            });
        }
    }
};

Мне нравится этот подход, и я думаю, если я широко использую jQuery в своем коде, мне следует использовать метод привязки. Я могу какое-то время просто использовать замыкания, чтобы привыкнуть к их использованию, а затем, когда они освоятся, я смогу использовать и то, и другое. Спасибо.

bitsprint 31.10.2008 23:25

Другие вопросы по теме