2012-03-23 118 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'? – 2012-03-23 01:31:35

+0

謝謝你回答這麼快Paolo。這實際上也不起作用,我也嘗試使用Student.fetchStudentDetails調用它,但無濟於事。 – 2012-03-23 01:37:36

回答

1

您的this上下文都是錯誤的。 this.config.studentSelectionundefined以及this.config.fetchStudentDetailsthis是指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('''')'語句,這導致我相信'config.studentSelection有錯誤。 on('click','.row',fetchStudentDetails)'語句,代碼似乎停止在那裏。 – 2012-03-23 02:14:31

相關問題