Backbone.js Uncaught ReferenceError

僤鯓⒐⒋嵵緔 提交于 2019-12-13 06:20:25

问题


Im new to backbone, trying to fetch json from the Wordpress json plugin and render into a template, but when looping through posts I get the following error Uncaught ReferenceError: posts is not defined Any help appreciated. Thanks...

   jQuery(function($) {
    var Post = Backbone.Model.extend();
    var Posts = Backbone.Collection.extend({
        model: Post,
        url: '/api/get_post/?json=get_recent_posts',
        parse: function(resp) {
            console.log("posts", resp);
            return resp;
        }
    });
    var listView = Backbone.View.extend({
        el: '#content',
        template: _.template($("#post-template").html()),
        initialize: function() {
            this.model.bind("reset", this.render, this);
        },
        render: function() {
            $(this.el).html(this.template(this.model.toJSON()));
            return this;
        }
    });
    var AppRouter = Backbone.Router.extend({
        routes: {
            "!/archive": "archive"
        },
        archive: function() {
            this.postList = new Posts();
            this.postListView = new listView({
                model: this.postList
            });
            this.postList.fetch();
            this.postListView.render();
        }
    });
    var app = new AppRouter();
    Backbone.history.start();
});

Template

<script id="post-template" type="text/template">
    <ul>
      <% _.each(posts, function(post) { %>
        <li id="<%= post.id %>">
          <a href="<%= post.url %>"><%= post.thumbnail %></a>
        </li>
      <% }); %>
    </ul>
</script>

Json

{
    "status": "ok",
    "count": 1,
    "count_total": 1,
    "pages": 1,
    "posts": [{
        "id": 4,
        "type": "post",
        "slug": "test-post",
        "url": "http:\/\/localhost:8888\/2013\/04\/test-post\/",
        "status": "publish",
        "title": "Test Post",
        "title_plain": "Test Post",
        "content": "",
        "excerpt": "",
        "date": "2013-04-17 15:12:21",
        "modified": "2013-04-19 14:13:00",
        "categories": [],
        "tags": [],
        "author": {
            "id": 1,
            "slug": "admin",
            "name": "admin",
            "first_name": "",
            "last_name": "",
            "nickname": "admin",
            "url": "",
            "description": ""
        },
        "comments": [],
        "comment_count": 0,
        "comment_status": "closed",
        "thumbnail": "http:\/\/localhost:8888\/wp-content\/uploads\/2013\/04\/test-image-150x150.jpg"
    }]
}

回答1:


Calling Collection#toJSON will return an array. Therefore there is no posts key. Try using $(this.el).html(this.template(this.model.toJSON()[0])); as you only have one model in your collection (which is weird).

You may want to parse your response in the parse methods to return resp.posts so your collection has more meaning and actually creates one Post model per post.




回答2:


Try to do something like:

$(this.el).html({
   posts : this.template(this.model.toJSON())
});

instead of:

$(this.el).html(this.template(this.model.toJSON()));



回答3:


If you want to use posts as the variable that contains the collection/array in your underscore template, you need to pass it as a property to the template function:

$(this.el).html(this.template({ posts: this.model.toJSON() } ));

I would have also thought your Posts Collection class should have returned the posts in the parse function as shown below (as the posts are a property of the JSON that's being returned):

var Posts = Backbone.Collection.extend({
    model: Post,
    url: '/api/get_post/?json=get_recent_posts',
    parse: function(resp) {
        console.log("posts", resp);
        return resp.posts || [];  // grab the posts from the JSON 
    }
});

And, often by convention you might want to switch to using the collection attribute of the View:

this.postListView = new listView({
     collection: this.postList
});

And then change your template call: { posts: this.collection.toJSON() }.



来源:https://stackoverflow.com/questions/16148723/backbone-js-uncaught-referenceerror

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!