2016-06-30 5 views
0

取得したコレクションデータをhtmlページに表示する簡単なhtmlページを取得しようとしています。エラーがスローされないので、私が間違っていることを伝えることはできません。バックボーンJS - レンダリングされないビュー

モデル、コレクション、およびビューは、コンソールからAPIから取得されたデータで表示されるため、正しく作成されていますが、ページには何も表示されません。どんな助けでも大歓迎です。

モデル

Department = Backbone.Model.extend({ 
    idAttribute: "dept_id", 
    urlRoot: appRouteUrl + '/api/v1/departments', 
    defaults: { 
    dept_code: '', 
    dept_desc: '' 
    } 
}); 

コレクション

DepartmentCollection = Backbone.Collection.extend({ 
    url: appRouteUrl + '/api/v1/departments', 
    model: Department 
}); 

ビュー

var DepartmentListView = Backbone.View.extend({ 
    template: "#department-list-template", 
    tagName: "ul", 
    render: function() { 
    var results = []; 
    var compiledTemplate = _.template(this.template); 
    this.collection.each(function(department) { 
     console.log(department); 
     var html = compiledTemplate(department.toJSON()); 
     results.push(html); 
    }); 
    this.$el.html(results); 
    return this; 
    } 
}); 

引x

<!DOCTYPE html> 
<html> 

<head> 
    <title>AppName</title> 
</head> 

<body> 
    <div class="departments"> 
    <script type="text/template" id="department-list-template"> 
     <span><%= dept_desc %></span> 
    </script> 
    </div> 
    <script> 
    var departments = new DepartmentCollection(); 
    departments.fetch(); 

    var departmentList = new DepartmentListView({ 
     collection: departments 
    }); 

    $('.departments').html(departmentList.render().$el); 
    departmentList.render(); 
    </script> 
</body> 

</html> 

答えて

0

を使用して、アイテムのビューを持っていないので、私はそれがコレクションビューのテンプレートに反復するのがベストだと思います。コレクションのフェッチメソッドが成功した後で、ビューインスタンスを作成する/レンダリングすることを確認してください。

また、テンプレートを削除できる要素の内側に追加しないでください。

Department = Backbone.Model.extend({ 
 
    idAttribute: "dept_id", 
 
    defaults: { 
 
    dept_code: '', 
 
    dept_desc: '' 
 
    } 
 
}); 
 

 
DepartmentCollection = Backbone.Collection.extend({ 
 
    model: Department 
 
}); 
 

 
var DepartmentListView = Backbone.View.extend({ 
 
    template: _.template($('#department-list-template').html()), 
 
    tagName: "ul", 
 
    render: function() { 
 
    this.$el.html(this.template({ 
 
     departments: this.collection.toJSON() 
 
    })); 
 
    return this; 
 
    } 
 
}); 
 
var departments = new DepartmentCollection([{ 
 
    dept_id: 1, 
 
    dept_code: 'test1', 
 
    dept_desc: 'test1' 
 
}, { 
 
    dept_id: 2, 
 
    dept_code: 'test2', 
 
    dept_desc: 'test2' 
 
}]); 
 

 
/* 
 
departments.fetch({ 
 
    success: function(){ 
 
    // render the view here 
 
    } 
 
}); 
 
*/ 
 

 
var departmentList = new DepartmentListView({ 
 
    collection: departments 
 
}); 
 

 
$('.departments').html(departmentList.render().$el);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script> 
 
<div class="departments"></div> 
 
<script type="text/template" id="department-list-template"> 
 
    <% _.each(departments,function(deparment){ %> 
 
    <li><span><%= deparment.dept_desc %></span></li> 
 
    <% }); %> 
 
</script>

+0

すべてのヘルプありがとうございますが、何も返されず、エラーもなく画面上に何も表示されません。私はこれを別の手法で試してみようと思っています。 – merty41

0

ajax呼び出しが完了する前にレンダリングを呼び出しています。フェッチが完了したら、deferredとcall renderを使用するだけです。

は、このよう

<!DOCTYPE html> 
<html> 
<head> 
    <title>AppName</title> 

</head> 
<body> 
<script type="text/template" id="department-list-template"> 
    <li><%= dept_desc %></li> 
</script> 


<div class="departments"> 

</div> 
<script type="text/javascript"> 

    var departments = new DepartmentCollection(); 

    var departmentList = new DepartmentListView({ 
    collection: departments 
    }); 
    $.when(departments.fetch()).then(function() { 
    $('.departments').html(departmentList.render().$el); 
    }); 

</script> 
</body> 
</html> 

とビュー

var DepartmentListView = Backbone.View.extend({ 
     template: _.template($('#department-list-template').html()), 
     tagName: "ul", 


     render: function() { 
      var results = []; 

      var self = this; 
      this.collection.each(function (department) { 
       console.log(department); 
       var html = self.template(department.toJSON()); 
       results.push(html); 
      }); 

      this.$el.html(results); 

      return this; 
     } 

    }); 
+0

私は上記を行うと、私は次のページに表示され得ます。 #department-list-template#department-list-template – merty41

+0

この$( '。departments').html(departmentList.render()。el)を試してみてください。 –

+0

同じ結果が得られます。 – merty41

0

下線テンプレート関数を、HTMLを変更してみてくださいHTML文字列を受け付けますが、あなたはそれをid文字列を与えています。

var DepartmentListView = Backbone.View.extend({ 
    template: _.template($('#department-list-template').html()), 


    tagName: "ul", 

    render: function(){ 
    var results = []; 

    this.collection.each(function(department){ 
    var html = this.template(department.toJSON()); 
    results.push(html); 
    }); 

    this.$el.html(results); 

    return this; 
    } 

}); 

EDITしてみてください:正しいコンテキスト

render: function(){ 
    var results = []; 
    var self = this; 
    this.collection.each(function(department){ 
    var html = self.template(department.toJSON()); 
    results.push(html); 
    }); 

    this.$el.html(results); 

    return this; 
    } 
+0

私は上記の提案を試しましたが、dept_list_view.jsをスローします:11 Uncaught TypeError:this.templateは関数ではありません – merty41

+0

はい、私は今、 'each'ではコンテキストがもうビューではないからです。 –

+0

まだエラーが発生しています。 dept_list_view.js:11 Uncaught TypeError:self.templateは関数ではありません – merty41

関連する問題