0

私の Ember アプリでは、Discourse の共同創設者のブログ投稿http://eviltrout.com/2013/02/27/adding-to-discourse-part-1.htmlからコピーした ajax 呼び出しを使用して、すべてのレストランのリストを取得します。

App.Restaurant.reopenClass({

  findAll: function() {

     return $.getJSON("restaurants").then(
      function(response) {
        var links = Em.A();
        response.restaurants.map(function (attrs) {
          links.pushObject(App.Restaurant.create(attrs));
        });
        return links;
      }
    );
   },

上記の findAll を呼び出してアプリケーション テンプレートにレンダリングするレストラン ルートを設定しました。

App.RestaurantsRoute = Ember.Route.extend({
 model: function(params) {
    return(App.Restaurant.findAll(params));

  },

  renderTemplate: function() {

    this.render('restaurants', {into: 'application'});
  }

});

restaurantsレストランは、個々のレストランへのリンクとともに、このようにテンプレートとして表示されます。restaurantテンプレも入れてる

<script type="text/x-handlebars" id="restaurants">

  <div class='span4'>
      {{#each item in model}}
      <li> {{#link-to 'restaurant' item}}
      {{ item.name }} 
      {{/link-to }}</li>
    {{/each}}

         </ul>
     </div>

  <div class="span4 offset4">
   {{ outlet}}
   </div>

</script>

Emberルーターでは、このように親子ルートを設定しています

 this.resource("restaurants", function(){
         this.resource("restaurant", { path: ':restaurant_id'});

     });

したがって、レストラン リストの特定のレストランへのリンクをクリックすると、このrestaurantテンプレートが(複数outletの) テンプレートで定義された場所に挿入されることを期待しています。restaurantS

<script type="text/x-handlebars" id="restaurant">
         this text is getting rendered
      {{ item }} //item nor item.name are getting rendered         
</script>

このレストラン テンプレートはレンダリングされていますが、 のデータはitem表示されていません。

{{#link-to 'restaurant' item}}リストをクリックすると、itemそのレストランを表します。

findAllこのセットアップでは、Ember はその特定のアイテムを取得するために別の ajax 呼び出しを行う必要がありますか?呼び出しから既に読み込まれていますか?

個々のレストランを照会する必要がある場合に備えて (再び)、個々のレストランの新しいルートを作成しました

App.RestaurantRoute = Ember.Route.extend({
  model: function(params) {
    console.log(params);
    console.log('resto');
    return App.Restaurant.findItem(params);
  }

});

Restaurant モデルの findItem

App.Restaurant.reopenClass({

findItem: function(){
    console.log('is this getting called? No...');
    return 'blah'
  }

しかし、それらの console.logs はどれも呼び出されていません。

Ember スターター ビデオhttps://www.youtube.com/watch?v=1QHrlFlaXdIでは、Tom Dale がリストからブログ投稿をクリックすると、定義されたテンプレートに投稿が表示されます。投稿テンプレート内にルート (私が行ったように) と {{outlet}} を設定して、投稿を受け取ります。

この状況で同じことがうまくいかない理由がわかりますか?

4

1 に答える 1

0

restaurantルートにナビゲートするitemと、modelがこのルートになります。

したがって、テンプレートで試してみると

  <script type="text/x-handlebars" id="restaurant">  
     this text is getting rendered  
  {{ model.name }}      
  </script>

レストランの名前が表示されます

また、モデルフックも呼び出されず、それ以降console.logの s は機能していません

注: 動的セグメントを含むルートは、URL を介して入力されたときにモデル フックのみが呼び出されます。トランジションを介してルートに入る場合 (たとえば、ハンドルバーへのリンク ヘルパーを使用する場合)、モデル コンテキストは既に提供されており、フックは実行されません。動的セグメントのないルートは、常にモデル フックを実行します。

すべてが今明らかになることを願っています。

于 2013-09-11T03:40:28.263 に答える