2013-03-24 120 views
0

我正在創建一個Ember應用程序來顯示Twitter提要,但我無法通過嵌入式資源顯示單個推文。Ember.js路由器:嵌入式資源

的代碼如下:

模板

<script type="text/x-handlebars" data-template-name="tweets"> 
     <div id="stream"> 
      {{#each tweet in controller}} 
       <div class="tweet"> 
        <p class="tweet_text">{{tweet.text}}</p> 
        <p> {{#linkTo "tweet" tweet}} {{tweet.id}} {{/linkTo}}</p> 
       </div> 
      {{/each}} 
     </div> 
    </script> 

    <script type="text/x-handlebars" data-template-name="tweet"> 
     <div id="detail"> 
      {{text}} 
     </div> 
    </script> 

路由器

window.App = Ember.Application.create({ 
    LOG_TRANSITIONS: true 
}); 

App.Router.map(function(){ 
    this.resource('tweets',function(){ 
     this.resource('tweet',{path: ':tweet_id'}) 
    }); 
}); 

// (1) App.Router.map(function(){ 
//  this.resource('tweets') 
//  this.resource('tweet',{path: ':tweet_id'}) 
//  }); 



App.IndexRoute = Ember.Route.extend({ 
    redirect: function() { 
    this.transitionTo('tweets'); 
    } 
}); 

App.TweetsRoute = Ember.Route.extend({ 
    model: function(){ 
    var me = []; 
    $.getJSON("http://search.twitter.com/search.json?q=emberjs&rpp=200&count=200&callback=?", 
     {}, 
     function (data) { 
     $.each(data.results,function(k,tweet){ 
      var tweet = App.Tweet.create({ 
       created_at: tweet.created_at, 
       from_user: tweet.from_user, 
       profile_image_url: tweet.profile_image_url, 
       text: tweet.text, 
       id: tweet.id 
      }); 
      me.pushObject(tweet); 
     }); 
    }); 
    return me; 
    } 
}); 

對象&控制器

App.TweetsController = Ember.ArrayController.extend({}); 

App.Tweet = Ember.Object.extend({ 
    created_at: "", 
    from_user: "", 
    profile_image_url: "", 
    text: "", 
    id: 0 
}) 

正如你所看到的,我有一個評論我們的路由器(1),它可以找到正確的推文,並將其呈現在推文模板中。不過,我希望將這條路線嵌套起來,以便我可以將其作爲主 - 細節應用程序來實現。

使用LOG_TRANSITIONS,我可以看到正確的路由被初始化,但我無法獲取要呈現的嵌套資源路徑。

任何想法將非常感激,在此先感謝。

回答

0

我得到了這個工作。對於任何類似的人,我都這樣做了:

模板 - 將{{#linkTo}}「tweet」...更改爲{{#linkTo}}「tweets.tweet」... AND加入{{出口}}

<script type="text/x-handlebars" data-template-name="tweets"> 
    <div id="stream"> 
     {{#each tweet in controller}} 
      <div class="tweet"> 
       <p class="tweet_text">{{tweet.text}}</p> 
       <p> {{#linkTo "tweets.tweet" tweet}} {{tweet.id}} {{/linkTo}}</p> 
      </div> 
     {{/each}} 
    </div> 
    {{ outlet }} 
</script> 

路由器 - 改變 'this.resource' 到 'this.route'

App.Router.map(function(){ 
    this.resource('tweets',function(){ 
     this.route('tweet',{path: ':tweet_id'}) 
    }); 
}); 

買者

我認爲這是一種變通方法,並且嵌套資源在這方面是正確的方法。我知道嵌套路線應該是「動詞」或動作路線。如果有人知道這個問題的正確方法,我仍然會很感激,但希望上面的內容能幫助其他相關的人。

+0

如果您對此修復使用this.resource,它不起作用?我可以發現的唯一錯誤,就是你已經在你的模板中修復了這些錯誤。 – mavilein 2013-03-24 11:29:46

+0

不,如果我改變只是路由器閱讀'資源'而不是'路線'我得到「未捕獲錯誤:斷言失敗:路由tweets.tweet沒有找到」,所以我改變鏈接在我的{{linkTo}}回到只是'鳴叫',我沒有得到錯誤,但我也沒有得到一個渲染模板。如果感覺像這樣一個小事情,但我不能把它釘住。 – 2013-03-24 11:37:42

+0

只需再次閱讀指南http://emberjs.com/guides/routing/defining-your-routes/。我認爲嵌套資源路由的名稱應該只是鳴叫。當你將它作爲一個資源嵌套時,它似乎不會繼承父路由中的名稱前綴。所以請嘗試{{#linkTo'tweet'tweet}} plz :-) – mavilein 2013-03-24 11:45:35