2012-04-19 13 views
0

'entries /:id'のURLを訪問/ナビゲートしたときに、モデル値をルータから警告することができません。しかしコンソールログでは、私は正しい属性&値を持つ変数を見ることができます。私はクロムコンソールでデータを取得するためにテストした&それは正常に動作します。私のルータ内部のcoffeescriptを使用してモデル値を取得する方法Backbone.js Coffeescript

私のモデルの内部
class Raffler.Routers.Entries extends Backbone.Router 
    routes: 
    '': 'index' 
    'entries/:id': 'show' 

    initialize: -> 
    @collection = new Raffler.Collections.Entries() 
    @collection.reset($('#container').data 'entries') 

    index: -> 
    view = new Raffler.Views.EntriesIndex(collection: @collection) 
    $('#container').html(view.render().el) 

    show: (id) -> 
    entry = new Raffler.Models.Entry({id: id}) 
    entry.fetch() 
    console.log(entry.get('title')) 
    alert entry.get('name') 
    console.log(entry) 
    console.log(entry.attributes + " haha") 
    viewsangat = new Raffler.Views.Page({model: entry}) 
    viewsangat.render() 

class Raffler.Models.Entry extends Backbone.Model 
    urlRoot: '/api/entries' 

    win: -> 
    @set(winner: true) 
    @save() 
    @trigger('highlight') 

ソリューション: 私はフェッチからの値が成功イベントに及びそのための我々IF /後の時にのみ利用することが分かりました次の行でgetを使用しようとすると、おそらく期待どおりの値が返されません。

答えて

1

一部のコンソールでは、フェッチ後のオブジェクトの値が表示されます。いずれにせよ、問題はfetch()が非同期であることです。

entry = new Raffler.Models.Entry({id: id}) 
entry.fetch() #HERE IS YOUR ISSUE 
alert entry.get('name') #fetch has not yet returned 

次のことを試してみてください。

entry = new Raffler.Models.Entry({id: id}) 
entry.fetch() #HERE IS YOUR ISSUE 
entry.on("reset") -> 
    alert(entry.get('name')) #fetch has not yet returned 

問題が解決しない場合は、変更は "変更" に "リセット"。

ここでは、モデル上でfetchonイベントバインディングを使用しています。

+0

私は成功コールバックを使用することをお勧めします。 –

+0

これは推奨されている方法ではありませんが、動作します。イベントバインドの理由は、モデル/コレクションの変更をリッスンする複数のものがある場合です。成功のコールバックはそれらをすべて起動することはできませんし、そうした場合、あなたはスパゲッティコードで終わるでしょう。 – Gazler

関連する問題