阅读无数的骨干教程,但仍然缺少一些东西

时间:2016-07-06 19:27:09

标签: backbone.js twitter underscore.js lodash underscore.js-templating

我在StackExchange上阅读了无数帖子以及互联网上无数的教程,但我似乎还没有理解基本的Backbone使用和实现。

我正在尝试使用从我工作服务器上的PHP文件生成的预过滤JSON来构建自定义Twitter时间轴。

我感觉很亲密,但我似乎无法让事情发挥作用。有时我可以在我的控制台中查看20条推文,但我只能通过我的模板获得1条推文。

以下是我目前的Backbone设置:

(function($){

    if(!this.hasOwnProperty("app")){ this.app = {}; }
    app.global = this;

    app.api = {};

    app.api.Tweet = Backbone.Model.extend({
       defaults: {} 
    });

    app.api.Tweets = Backbone.Collection.extend({
        model: usarugby.api.Tweet,
        url: "https://custom.path.to/api/tweets/index.php",
        parse: function(data){
            return data;
        }
    });

    app.api.TweetsView = Backbone.View.extend({
        el: $('#tweet-wrap'),
        initialize: function(){
            _.bindAll(this, 'render');
            this.collection  = new app.api.Tweets();
            this.collection.bind('reset', function(tweets) {
                tweets.each(function(){
                    this.render();
                });
            });
            return this;
        },
        render: function() {
            this.collection.fetch({
                success: function(tweets){
                    var template =  _.template($('#tweet-cloud').html());
                    $(tweets).each(function(i){
                        $(this).html(template({
                            'pic': tweets.models[i].attributes.user.profile_image_url,
                            'text': tweets.models[i].attributes.text,
                            'meta': tweets.models[i].attributes.created_at
                        }));
                    });
                    $(this.el).append(tweets);
                }
            });
        }
    });

    new app.api.TweetsView();

}(jQuery));

这是我当前的HTML和模板:

<div id="header-wrap"></div>      

<div id="tweet-wrap"></div>

<script type="text/template" id="tweet-cloud">
    <div class="tweet">
        <div class="tweet-thumb"><img src="<%= pic %>" /></div>
        <div class="tweet-text"><%= text %></div>
        <div class="tweet-metadata"><%= meta %></div>
    </div>
</script>

<script> if(!window.app) window.app = {}; </script>

我还有CodePen可用于测试。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

与评论建议一样,可能需要额外的阅读和代码重写。渲染多个视图的视图最简单的示例是adrianmejia's backbone tutorial example

下面的代码段包含一个附加视图和一些附加功能,以及更新渲染和初始化功能。搜索“cfa”以查看更改。

(function($){
    
    if(!this.hasOwnProperty("app")){ this.app = {}; }
    app.global = this;

    app.api = {};

    app.api.Tweet = Backbone.Model.extend({
        idAttribute: 'id_str'
    });

    app.api.Tweets = Backbone.Collection.extend({
        model: app.api.Tweet,
        url: "https://cdn.usarugby.org/api/tweets/index.php",
        parse: function(data){
            return data;
        }
    });
    
    app.api.TweetView = Backbone.View.extend({
        tagName: 'div',
        template: _.template($('#tweet-cloud').html()),
        initialize: function(){
            
        },
        render: function(){
            var j = {};
            j.pic = this.model.get('user').profile_image_url;
            j.text = this.model.get('text');
            j.meta = this.model.get('meta');
            this.$el.html(this.template(j));
            return this;
        },
    });
    
    app.api.TweetsView = Backbone.View.extend({
        el: $('#tweet-wrap'),
        initialize: function(){
            this.collection = new app.api.Tweets();
            this.collection.on('reset', this.onReset, this);
            this.collection.on('add', this.renderATweet, this);
            this.collection.fetch();
        },
        
        onReset: function(){
            this.$el.html('');
            this.collection.each(this.renderATweet, this);
        },
        renderATweet: function (tweet) {
            var tweetView = new app.api.TweetView({ model: tweet });
            this.$el.append(tweetView.render().el);
        },
    });
}(jQuery));


    $(document).ready(function(){
        new app.api.TweetsView();
    });
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
<script src="https://static.usarugby.org/lib.min.js"></script>

<div id="header-wrap"></div>

<div id="tweet-wrap"></div>

<script type="text/template" id="tweet-cloud">
    <div class="tweet">
        <div class="tweet-thumb"><img src="<%= pic %>" /></div>
        <div class="tweet-text">
            <%= text %>
        </div>
        <div class="tweet-metadata">
            <%= meta %>
        </div>
    </div>
</script>

<div id="footer-wrap"></div>

<script>
    if(!window.app) window.app = {};
</script>