2012-02-26 8 views
0

私は、Backbone.js用のサンプルアプリケーションのようなTodo-listアプリケーションを開発しようとしています。コードはhere(プロトタイプ分岐は最新です)です。テキストが入力されると、そのテキストを含むタスクをローカルストレージに保存する必要があります。しかし、以下のエラーでテキストを保存できませんでした。この「backbone.js」コードには「a._validateは関数ではありません」というエラーがあります。

a._validateは

なぜ関数ではありませんか?コードは以下のとおりです。

アプリ/資産/ JavaScriptの/ tasks.js.coffee

$ -> 
    tasks = new Todoapp.Collections.Tasks 
    appView = new Todoapp.Views.AppView(el: $("#todoapp"), collection: tasks) 

アプリ/資産/ JavaScriptの/バックボーン/ビュー/ app.js.coffee

Todoapp.Views.AppView = Backbone.View.extend 
    events: 
    "keypress #task_input" : "createTask" 
    initialize: -> 
    this.collection.bind("add", this.alertCreate, this) 
    createTask: (e) -> 
    text = $("#task_input").val() 
    return if !text or e.keyCode isnt 13 
    this.collection.create(content: text) 
    $("#task_input").val("") 
    alertCreate: -> 
    alert("Created!") 

アプリ/資産/ JavaScriptの/バックボーン/コレクション/ tasks.js.coffee

Todoapp.Collections.Tasks = Backbone.Collection.extend 
    model: Todoapp.Models.Task 
    localStorage: new Store("tasks") 

アプリ/資産/ JavaScriptの/バックボーン/モデル/ task.js.coffee

Todoapp.Models.Task = Backbone.Model.extend 

答えて

2

あなたの問題は、あなたのモデル定義である:すべてのことであるん

Todoapp.Models.Task = Backbone.Model.extend 

Todoapp.Models.TaskBackbone.Model.extend方法を割り当てて、それがextendメソッドを実行しません。いくつかの括弧を追加し、それが動作します:

Todoapp.Models.Task = Backbone.Model.extend() 

はデモ:http://jsfiddle.net/ambiguous/ejjHz/

以上、あなたのCoffeeScriptでCoffeeScriptのではなく、CoffeeScriptのとJavaScriptのいくつかの混合物を書く:

class Todoapp.Models.Task extends Backbone.Model 

class Todoapp.Collections.Tasks extends Backbone.Collection 
    model: Task 
    localStorage: new Store('tasks') 

class Todoapp.Views.AppView extends Backbone.View 
    events: 
    'keypress #task_input' : 'createTask' 
    initialize: -> 
    @collection.bind('add', @alertCreate) 
    createTask: (e) -> 
    text = $('#task_input').val() 
    return if !text or e.keyCode isnt 13 
    @collection.create(content: text) 
    $('#task_input').val('') 
    alertCreate: => 
    alert('Created!') 

デモ:http://jsfiddle.net/ambiguous/HPHVG/

変更点:

  1. C = B.extendの代わりにclass ... extendsを使用してください。これだけであなたの問題は解決します。
  2. thisの代わりに@を使用してください。
  3. bindにコンテキストを提供する代わりに、バインドされたメソッド(=>)を使用してください。
+0

私はこの回答が好きです。追加するだけで、アンダースコアの問題がある場合は、backbone.jsの前にunderscore.jsがロードされていることを確認してください。 – Luke

+0

@Luke:teクラスを定義するときに "undefined is not関数"の問題が発生するfアンダースコアが読み込まれませんでしたしかし、。これは「カッコは問題でない場合を除いてオプションです」という問題です。 –

+0

ありがとうございました!それはちょうど働いた! 私はBackbone.jsでCoffeeScriptを学んでいるので、あなたのアドバイスは非常に便利です。 – naoty