Подчеркнуть bindAll: сохранение контекста «это» - PullRequest
4 голосов
/ 25 октября 2011

У меня возникают проблемы при попытке сохранить uploader в качестве this контекста при вызове onSubmit. Может ли какой-нибудь гуру JS помочь?

uploader: {

        init: function(){
            var that = this;

            var fileUploader = new Uploader.FileUploaderBasic({
                    button      : $("#upload-btn")[0],
                    action      : "/filesCollection",
                    onSubmit    : that.onSubmit
                });

            _.bindAll(this, this.onSubmit); // attempting to bind 'this'
        },


        onSubmit: function(id, fileName){
            console.log(this); // still refers to 'fileUploader' object :(
        }

}

Приводит к следующей ошибке:

Uncaught TypeError: Cannot read property 'bind' of undefined

Пример: http://jsfiddle.net/WilsonPage/BE3Lp/5/

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Решено: http://jsfiddle.net/WilsonPage/BE3Lp/41/

Несколько важных вещей, которые я обнаружил:

  1. _.bindAll() должен быть вызван до назначения функции.
  2. Первый аргумент должен быть объектом или this, который вы хотите связать.
  3. Следующие аргументы должны быть именами функций, присутствующих в объекте (this), и они должны быть в строковом виде!
  4. Если вы хотите связать все функции в объекте (this), тогда опустите любые имена функций и используйте объект (this) в качестве единственного аргумента, например. _.bindAll(this)

Надеюсь, это поможет некоторым сбитым с толку взглядам вроде меня!

1 голос
/ 25 октября 2011

Используя call или apply, вы можете указать контекст для this для любой функции.Это должно помочь (в объявлении fileUploader):

onSubmit: function() {
    that.onSubmit.apply(that, arguments);
}

Редактировать: Обновлен jsfiddle: http://jsfiddle.net/WDTBV/1/

...