2012-03-23 2 views
0

Я создаю плагин Wordpress, и я создал объектный литерал, в котором я хотел бы инкапсулировать всю свою логику, но я не могу заставить обработчик событий стрелять.Обработчик событий в объектном литерале не срабатывает

Я использую JQuery 1.7.1

Первый, у меня есть строки данных, создается с помощью PHP:

<div class="table-wrapper"> 

    <?php 
     global $wpdb; 

     $students = $wpdb->get_results("SELECT studentID, lname, fname, email FROM student");  

    foreach($students as $student) : ?> 
    <div class="row" id="<?php echo $student->studentID; ?>" > 
     <div class="last_name"> 
      <h4><?php echo __($student->lname); ?></h4> 
     </div> 
     <div class="first_name"> 
      <h4><?php echo __($student->fname); ?></h4> 
     </div> 
     <div class="phone"> 
      <h4><?php echo __($student->phone); ?></h4> 
     </div> 
     <div class="email"> 
      <h4><?php echo __($student->email); ?></h4> 
     </div> 
    </div><!-- /row --> 
    <?php endforeach; ?> 
    <div id="new"> 
     <button id="new_student"><?php echo __('Add New Student'); ?></button> 
    </div> 
</div><!-- /table-wrapper --> 

И это мой JavaScript/файл JQuery:

var Student = { 
    init: function(config) { 
    this.config = config; 
    this.isDisplayed = false; 
    console.log('in init'); // this fires upon instantiation 
    this.bindEvents(); 
    }, 

    bindEvents: function(){ 
    console.log('in bind'); // this fires upon instantiation 
    this.config.studentSelection.on('click', '.row', this.config.fetchStudentDetails); 
    console.log('after'); // this does NOT fire 

    }, 

    fetchStudentDetails: function() { 
    var self = Student; 
    alert('in event'); // this does NOT fire 
    } 
}; 

Student.init({ 
    studentID: jQuery('.row').attr('id'), 
    studentSelection: jQuery('.table-wrapper') 
}); 

Я пробовал пару небольших вариаций, таких как передача «.row» в переменную studentSelection и просто попытка связать обработчик события с ним непосредственно в методе bindEvents:

bindEvents: function(){ 
    console.log('in bind'); // this fires upon instantiation 
    this.config.studentSelection.on('click', this.config.fetchStudentDetails); 
    console.log('after'); // this does NOT fire 
    }, 

Student.init({ 
    studentID: jQuery('.row').attr('id'), 
    studentSelection: jQuery('.row') 
}); 

Я, однако, может стрелять событие щелчка, когда я выписывать такой код:

jQuery('.row').click, function(){ 
    console.log('in click event'); 
}); 

Я не понимаю, что происходит, так что если кто-то может пролить некоторый свет на нем или указать мне в правильном направлении, я бы очень признателен.

+0

Не должен 'this.config.fetchStudentDetails' быть' this.fetchStudentDetails'? –

+0

Спасибо, что так быстро ответил Паоло. На самом деле это тоже не работает, я также попробовал позвонить ему, используя Student.fetchStudentDetails, но безрезультатно. –

ответ

1

В вашем this контексте все неправильно. this.config.studentSelection - undefined, а также this.config.fetchStudentDetails. this относится к bindEvents не для init. Я предлагаю вам использовать другой шаблон здесь. Что-то вроде этого:

var Student = function (config) { 

    config = config || {}; 

    var that = this, // In case you need to use the original `this` 
     isDisplayed = false; 

    var init = function() { 
     console.log('in init'); 
     bindEvents(); 
    }; 

    var bindEvents = function() { 
     console.log('in bind'); 
     config.studentSelection.on('click', '.row', fetchStudentDetails); 
     console.log('after'); 
    }; 

    var fetchStudentDetails = function() { 
     // var self = Student; <-- Use `that` 
     alert('in event'); 
    }; 

    return { 
     init: init, 
     bindEvents: bindEvents, 
     fetchStudentDetails: fetchStudentDetails 
    } 

}; 

// Create a new student 
var student = new Student({ ... }); 
student.init(); 
+0

спасибо, что ответите. Хотел бы я сказать, что я все понимаю, но поскольку я все еще пытаюсь обвести голову объектной литературой, и этот шаблон я пока не вижу преимущества/различия между ними. Я тоже пробовал свой код, но он все еще не работает, я никогда не вижу в консоли bindEvents инструкции 'console.log ('after')', что заставляет меня поверить, что что-то не так: config.studentSelection. on ('click', '.row', fetchStudentDetails) ', код просто, кажется, останавливается на этом. –

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