私は現在Backbone.jsでPeepCodeビデオを処理していますが、すべてを裸のJavaScriptではなくCoffeeScriptで書き込もうとしています。
これまでのところ、コードでJasmineテストを実行しようとした場合を除いて、いくつかのTypeErrorsが発生しました。
TypeError: Cannot call method 'isFirstTrack' of undefined
TypeError: Cannot call method 'get' of undefined
私のCoffeeScript/Backboneファイルは次のようになります。
jQuery ->
class window.Album extends Backbone.Model
isFirstTrack: (index) ->
index is 0
class window.AlbumView extends Backbone.View
tagName: 'li'
className: 'album'
initialize: ->
@model.bind('change', @render)
@template = _.template $('#album-template').html()
render: =>
renderedContent = @template @model.toJSON()
$(@el).html(renderedContent)
return this
そして、このようなジャスミンのテスト仕様:
var albumData = [{
"title": "Album A",
"artist": "Artist A",
"tracks": [
{
"title": "Track A",
"url": "/music/Album A Track A.mp3"
},
{
"title": "Track B",
"url": "/music/Album A Track B.mp3"
}]
}, {
"title": "Album B",
"artist": "Artist B",
"tracks": [
{
"title": "Track A",
"url": "/music/Album B Track A.mp3"
},
{
"title": "Track B",
"url": "/music/Album B Track B.mp3"
}]
}];
describe("Album", function () {
beforeEach(function () {
album = new Album(albumData[0]);
});
it("creates from data", function () {
expect(this.album.get('tracks').length).toEqual(2);
});
describe("first track", function() {
it("identifies correct first track", function() {
expect(this.album.isFirstTrack(0)).toBeTruthy();
})
});
});
この問題は、CoffeeScriptがすべてを関数でラップすることに関係していると思います。方程式からjQueryを削除すると、正常に機能します。不思議なことに、Jasmineは、ページのコンソールでTypeError: Cannot call method 'isFirstTrack' of undefined
実行すると返されるので、ウィンドウが変数とメソッドにアクセスできるかどうかを教えてくれます。album.isFirstTrack(0)
true