2012-07-04 83 views
3

我在下面有這個js和qunit測試。爲什麼瀏覽器給我的listClasses沒有定義?如何解決它。我看到主要是javascript中的函數沒有定義

function ajax() { 
$.ajax({ 
});} 

但如果我喜歡以下如何做測試?

$('#MregisteredClasses').on('pageinit', function listClasses(){ 
var rowInput = "1"; 
var pageInput = "1"; 

$.ajax({ 
    url: 'http://137.57.102.146:8080/Training/getRegisteredClassesData.html', 
    data: ({rows : rowInput , page : pageInput}), 
    type: 'POST', 

    success: function(json_results){ 
    $('#list').append('<ul data-role="listview" data-inset="true"</ul>'); 
     listItems = $('#list').find('ul'); 
     $.each(json_results.rows, function(key) { 
      html = "<li data-mini='true' id='icon'><a href='http://137.57.102.146:8080/Training/MRegisteredClassesDetail.phone?courseId=" 
        + [json_results.rows[key].courseId] + "&regNo=" + [json_results.rows[key].regNo] + 
        "' rel='external'>" + json_results.rows[key].courseName+ "</a>" 
        + "<a href='http://137.57.102.146:8080/Training/MRateCourse.phone?courseId=" 
        + [json_results.rows[key].courseId] + "&regNo=" + [json_results.rows[key].regNo] + 
        "' rel='external'>RATE THIS COURSE</a></li>" ; 
      listItems.append(html); 
     }); 

     $('#list ul').listview(); 
    }, 
}); 
}); 

,這是qunit測試

test('asynchronous test', function() { 
// Pause the test, and fail it if start() isn't called after one second 
stop(); 

listClasses(function() { 
    // ...asynchronous assertions 
    ok(true, "Success"); 
}); 

setTimeout(function() { 
    start(); 
}, 2000); 
}); 

回答

0

$('#MregisteredClasses').on('pageinit', function listClasses(){ ...是不正確的使用。

該功能或者需要匿名(即丟棄listClasses位),在這種情況下運行listClasses()將失敗。

你需要做的是外部化函數聲明。

即:

function listClasses(){ 
    var rowInput = "1"; 
    var pageInput = "1"; 

    $.ajax({ 
    url: 'http://137.57.102.146:8080/Training/getRegisteredClassesData.html', 
    data: ({rows : rowInput , page : pageInput}), 
    type: 'POST', 

    success: function(json_results){ 
    $('#list').append('<ul data-role="listview" data-inset="true"</ul>'); 
     listItems = $('#list').find('ul'); 
     $.each(json_results.rows, function(key) { 
      html = "<li data-mini='true' id='icon'><a href='http://137.57.102.146:8080/Training/MRegisteredClassesDetail.phone?courseId=" 
        + [json_results.rows[key].courseId] + "&regNo=" + [json_results.rows[key].regNo] + 
        "' rel='external'>" + json_results.rows[key].courseName+ "</a>" 
        + "<a href='http://137.57.102.146:8080/Training/MRateCourse.phone?courseId=" 
        + [json_results.rows[key].courseId] + "&regNo=" + [json_results.rows[key].regNo] + 
        "' rel='external'>RATE THIS COURSE</a></li>" ; 
      listItems.append(html); 
     }); 

     $('#list ul').listview(); 
    } 
}); 
} 

然後從on命令調用該函數:

$('#MregisteredClasses').on('pageinit', listClasses) 

假設你的腳本只失敗了listClasses(),那麼我將認爲listClasses名字只是下降默默。

+0

喬鮑曼:我嘗試烏爾答案比它顯示此錯誤未捕獲的類型錯誤:對象[對象的對象]無方法「列表視圖」 來源:\t http://137.57.1​​02.146:8080/Training/js/MRegisteredClasses。 js:23 – sone

+0

由於錯誤提示,由$('#list ul')返回的對象沒有'listview()'函數。 listview在哪裏定義? –

+0

$('#list ul')。listview();這是不是定義listview? – sone

1

a difference函數聲明命名函數表達式

聲明的形式爲:

function myFunc() { 
    /* body */ 
} 

表達式是一切:

var x = function myFunc() { 
    /* body */ 
}; 

// or 

alert(function myFunc() { 
    /* body */ 
}); 

當一個函數表達式的function關鍵字後的名稱,該功能是通過這個名字只能訪問在功能體內部。因此你的問題。

var x = function myFunc() { 
    /* body */ 
}; 

x(); // okay 
myFunc(); // reference error 

更多的信息在Named function expressions demystified