2011-11-04 68 views
3

我與導軌API一個Backbone.js的應用程序,它提供了JSON工作,如下所示:Backbone.js的集合網址

[{ 
     "title": "Da vinci Code", 
     "price": "50" 
    }, 
    { 
     "title": "Some other name", 
     "price": "45" 
    }], 

TODO:

  1. 當用戶訪問的URL「www.backboneapp.com/authors/1「,它應該顯示屬於作者的書籍列表。

進展: - 服務器側導軌[authorscontroller#顯示]

def show 
    @author = Author.find(params[:id]) 
    @books = @author.books 
    respond_to do |format| 
    format.json { render :json => @books } 
    format.html 
    end 
end 

2.Client端,Backbone.js的

路由器:

routes: { 
    'authors/:id': 'showauthor' 
}, 

showauthor: function(id) { 

    $('#container').empty(); 
    window.available_books = new AvailableBookList({ 
    id: id 
    }); 

    this.availablebooklistview = new AvailableBookListView({ 
    id: id, 
    collection: available_books 
    }); 

    $('#container').append(this.availablebooklistview.render().el); 
} 

AvailableBookList Collection:

AvailableBookList = Backbone.Collection.extend({ 
    model: AvailableBook, 
    url: "/authors/" + this.id 
}) 

視圖部分:

$(document).ready(function(){ 

AvailableBookListView = Backbone.View.extend({ 
    tagName: 'section', 
    className: 'availablebooklist', 

    initialize: function() { 
    _.bindAll(this, 'render'); 
    this.collection.bind('reset', this.render); 
    }, 

    render: function() { 
    this.collection.each(function(available_book) { 
     var view = new AvailableBookView({ 
     model: available_book, 
     }); 

     this.$('.availablebooklist').append(view.render().el); 
    }); 
    return this; 
    } 
}); 

}); 

問題:當我訪問 「www.backboneapp.com/authors/1」我得到404錯誤。 在CONSOLE.LOG它顯示: GET:www.backboneapp.com/authors/ 不確定

在Rails日誌:parameters {id => undefined}

* 我在哪裏去了? *

任何幫助和建議高度讚賞

回答

6

我會假設你不意味着你的路由器new AuthorList,而是new AvailableBookList

你有你的收藏中的兩個問題:

  1. 在您的網址定義,thiswindow對象。
  2. 您在構造函數中傳遞的id參數是而不是應用於您的集合實例。它僅以視圖的方式工作(不適用於模型或集合)。

爲了解決第一個問題,你可以使用函數來定義一個集URL,這將讓你在正確的範圍:

AvailableBookList = Backbone.Collection.extend({ 
    model: AvailableBook, 
    url: function() { 
    return "/authors/" + this.id; 
    } 
}); 

對於第二個,你可以定義一個initialize功能並設置id屬性中有:

AvailableBookList = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.id = options.id; 
    }, 
    model: AvailableBook, 
    url: function() { 
    return "/authors/" + this.id; 
    } 
}); 

爲了提高可讀性,我還建議重新命名idauthor_id

AvailableBookList = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.author_id = options.author_id; 
    }, 
    model: AvailableBook, 
    url: function() { 
    return "/authors/" + this.author_id; 
    } 
}); 

更新

你也初始化您的收藏在錯誤的道路。按照Backbone.js source,構造函數簽名是models, options

window.available_books = new AvailableBookList(null, { 
    id: id 
}); 
+0

在'初始化:功能(模型,期權){this.id = options.id);}'我得到**無法讀取屬性「身份證'未定義**,即使author_id解決方案也給了我相同的錯誤..'initialize:function(options){this.id = options.id; }',這個工程....但我仍然得到同樣的錯誤**無法讀取屬性'ID'的undefined ** – railerhelper

+0

我正在使用backbone.js0.5.3 – railerhelper

+0

完成...添加視圖代碼.... – railerhelper