2012-06-02 5 views
1

Я изучаю backbone.js, и я пытаюсь настроить простую страницу входа. Вот подам view.js:Как получить доступ к базовому виду в обратном вызове submitHandler?

window.LoginView = Backbone.View.extend({ 

    events: { 

    }, 

    initialize : function() {  
     this.model.bind("error", this.error);  
     this.template = _.template(tpl.get('login'));  
    }, 

    login: function(form){ 
     this.model.set({ 
      login: $("#login", form).val(), 
      password: $("#password", form).val() 
     });   
    }, 

    render : function(eventName) {  
     $(this.el).html(this.template()); 
     $(this.el).find("form").validate({ 
      submitHandler: this.login 
     }); 
     return this; 
    } 
}); 

Как вы можете видеть, я использую jquery.validation присоединены, с образованием в render функции. Как submitHandler callback, я установил функцию login. Эта линия

this.model.set({... 

дает мне this.model is undefined ошибку поэтому я предполагаю, что this функция входа не то же самое, как this в initialize или render функций. Мой вопрос, как я могу получить доступ к базовой системе this в функции входа?

ответ

2

Один из способов заключается в использовании jQuery.proxy(), чтобы установить значение «это» для функции входа:

$(this.el).find("form").validate({ 
    submitHandler: $.proxy(this.login, this) 
}); 

Proxy возвращает новую функцию с новым значением для «этого». Поскольку «this» в функции рендеринга указывает на ваше представление, вы передаете его как второй аргумент прокси.

+0

спасибо;) Я придумал что-то, используя переменную tmp, назначенную с основой 'this', но ваше решение намного элегантнее :) – user367956

+0

Я думаю, что привязка предпочтительнее прокси в эти дни, но это помогает - спасибо! –

+0

да, если вам не нужно беспокоиться о старых браузерах: this.login.bind (this) – Zevan

Смежные вопросы