2016-10-23 5 views
0

アンダースコアテンプレートを使用してアイテムのリストをレンダリングしようとしています。しかし、それは何も表示しません。backbone.jsでのアンダースコアテンプレートによるレンダリング

私は2つのビューを作成しようとしました.1つはタスクであり、もう1つはタスクリストですが、私はテンプレートを使用することに固執しています。

  • .render()とは何ですか?
  • テンプレートを使用しても、レンダリングする必要がありますか?

this.$el.html(template_var)を実行したときにデータがテンプレート変数にマップされると思いましたか?

<!DOCTYPE HTML> 
 
<html> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>Title</title> 
 
</head> 
 
<body> 
 

 

 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<script src="http://underscorejs.org/underscore-min.js"></script> 
 
<script src="http://backbonejs.org/backbone-min.js"></script> 
 

 
     <script type="text/template" id="task_list"> 
 
      <li><%=title%></li> 
 
      <li><%=priority%></li> 
 
     </script> 
 

 
     </script> 
 

 
<script type="text/javascript"> 
 
     (function(){ 
 

 
     window.App = { 
 
      Models:{}, 
 
      Collections:{}, 
 
      Views:{} 
 
     }; 
 

 
     window.template = function(id){ 
 
      return _.template($('#' + id).html()); 
 
     } 
 
     
 

 
     App.Models.Task = Backbone.Model.extend({ 
 
       title: 'default', 
 
       priority: 1 
 
     }); 
 

 
     App.Collections.Task = Backbone.Collection.extend({ 
 
      model: App.Models.Task 
 
     }); 
 

 
     App.Views.Task = Backbone.View.extend({ 
 
      template: template('task_list'), 
 
      render(){ 
 
       var template = this.template(this.model.toJSON()); 
 
       console.log(template) 
 
       this.$el.html(template); 
 
       return this; 
 
      } 
 
     }) 
 

 
     App.Views.Tasks = Backbone.View.extend({ 
 
      tagName: 'ul', 
 
      render: function(){ 
 
       this.collection.each(this.addOne, this); 
 
       return this; 
 
      }, 
 
      addOne: function(task){ 
 
       var taskView = new App.Views.Task({ model: task}) 
 
       taskView.render(); 
 
       this.$el.append(taskView.render().el); 
 
      } 
 
     }) 
 

 
     var tasks = new App.Collections.Task([ 
 
      { 
 
        title: 'Go to store', 
 
        priority: 4 
 
       }, 
 
       { 
 
        title: 'Eat', 
 
        priority: 3 
 
       }, 
 
       { 
 
        title: 'Sleep', 
 
        priority: 4 
 
       } 
 
     ]) 
 

 
     var tasksView = new App.Views.Tasks({collection: tasks}) 
 
     $('body').html(tasksView.el) 
 

 
     })() 
 

 
</script> 
 

 
</body> 
 
</html>

答えて

2

あなたは本当に近かったが、小さな問題がありました。

バックボーンには多くのことがありますが、それはあなたのためにしないことの1つは、完全に開発者に任されているレンダリングロジックです。したがって、あなたは次のものを必要とします:012WをJSロジックから分離するためのテンプレート。

  • renderお気に入りのテクニックを使ってレンダリングする機能、当方の場合はjQuery。

バックボーンビューは常にtagNameが指定されていない場合、デフォルトでdivである、それはまだレンダリングされていなかった場合でもroot DOM element (el)を持っています。

描画されたときにだからあなたのタスクビューは、このような何かを見て:

<div> 
    <li>Go to store</li> 
    <li>4</li> 
</div> 

私は少し仕事にテンプレートを変更しました。


私はCSSをHEADセクションに戻しました。これは標準ですが、問題の1つではありませんでした。


モデルのデフォルト属性は、defaults propertyで指定する必要があります。次のようなshorthand syntax


定義関数はES6(ECMAScriptの2015)でのみ使用可能です。 ECMAScriptの2015(ES6)、導入された初期化子オブジェクトのメソッド定義のための短い構文を皮切り

render(){ 

。これは、メソッドの名前に割り当てられた関数の略語です。

そして、それcompatible with most browser作るために、あなたが使用する必要があります。

render: function() { 

また、リストビュー上でレンダリングを呼び出すのを忘れていました。

$('body').html(tasksView.el) 

は次のようになります。

$('body').html(tasksView.render().el); 

あなたのコードはIIFEの内部にあるので、あなたがあなたのアプリとwindowを持つグローバル関数を作成する必要はありません、ローカルvarが十分であるとより良いコーディング方法です。


<!DOCTYPE HTML> 
 
<html> 
 

 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>Title</title> 
 

 
    <!-- CSS should be in the head --> 
 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
 
</head> 
 

 
<body> 
 

 

 

 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script> 
 
    <script src="http://underscorejs.org/underscore.js"></script> 
 
    <script src="http://backbonejs.org/backbone.js"></script> 
 

 
    <script type="text/template" id="task_list"> 
 
     <%=title%> (<%=priority%>) 
 
    </script> 
 

 
    <script type="text/javascript"> 
 
     (function() { 
 

 
      var App = { 
 
       Models: {}, 
 
       Collections: {}, 
 
       Views: {} 
 
      }; 
 

 
      function template(id) { 
 
       return _.template($('#' + id).html()); 
 
      } 
 

 

 
      App.Models.Task = Backbone.Model.extend({ 
 
       defaults: { 
 
        title: 'default', 
 
        priority: 1 
 
       } 
 
      }); 
 

 
      App.Collections.Task = Backbone.Collection.extend({ 
 
       model: App.Models.Task 
 
      }); 
 

 
      App.Views.Task = Backbone.View.extend({ 
 
       template: template('task_list'), 
 
       tagName: 'li', 
 
       render: function() { 
 
        var template = this.template(this.model.toJSON()); 
 
        console.log(template) 
 
        this.$el.html(template); 
 
        return this; 
 
       } 
 
      }); 
 

 
      App.Views.Tasks = Backbone.View.extend({ 
 
       tagName: 'ul', 
 
       render: function() { 
 
        this.collection.each(this.addOne, this); 
 
        return this; 
 
       }, 
 
       addOne: function(task) { 
 
        var taskView = new App.Views.Task({ 
 
         model: task 
 
        }) 
 
        this.$el.append(taskView.render().el); 
 
       } 
 
      }); 
 

 
      var tasks = new App.Collections.Task([{ 
 
       title: 'Go to store', 
 
       priority: 4 
 
      }, { 
 
       title: 'Eat', 
 
       priority: 3 
 
      }, { 
 
       title: 'Sleep', 
 
       priority: 4 
 
      }]); 
 

 
      var tasksView = new App.Views.Tasks({ 
 
       collection: tasks 
 
      }); 
 
      $('body').html(tasksView.render().el); 
 

 
     })() 
 
    </script> 
 

 
</body> 
 

 
</html>

+0

'$( '体')HTML。(tasksView.render()エル。);'なぜ私はまだここに再びレンダリングコールする必要がありますか?私はすでにレンダリングメソッドの最後に 'return this'を使用していませんか? – Sandy

+0

@Sandy 'return this'は連鎖呼び出しのためのものです。 'render'はどこでも呼び出されないので、その行を呼び出す必要があります。 –

+0

私は '$( 'body')html(tasksView.el);のようなレンダリングのようなものを見たことがありませんでしたが、忘れました – Sandy

関連する問題