javascript - 为什么我通过点击获得用户的所有模型而不是一键模型?

标签 javascript backbone.js

单击集合中的一个模型后,我将获取该用户控制台中的所有模型,而不是单击的模型。谁能帮我吗?

App.js

在 App.js 中将模型发送到另一个 View ,为每个模型创建一个独特的 View

var App = Backbone.View.extend({

    initialize: function() 
    {
            this.collection = new Documents();
            console.log("this.collection init", this.collection);
            this.listenTo(this.collection, 'add', this.render);
            this.listenTo(this.collection, 'sync', this.renderSidebarModels);
    },

    renderSidebarModels: function() 
    {
            console.log("renderSidebarModels SYNC", this.collection);

            for(var i=0; i<this.collection.length; i++)
            {
                    console.log(this.collection.models);
                    this.sidebar = new SidebarView({model: this.collection.models[i]});
            }                      
    },

    $( document ).ready(function() {
       console.log( "ready!" );
       var app = new App();
    });

SidebarView.js

在 SidebarView.js 中,我从集合中获取所有模型。当我单击 id #titles 的按钮时,我会获取该用户的所有模型,而不仅仅是 this.model 上单击的模型。

var SidebarView = Backbone.View.extend({

        el : this.$("#sidebar"),

        template: _.template(this.$('#sidebar-template').html()),

        events: 
        {
                "click #titles": "open",
        },

        initialize: function() 
        {
                console.log("sidebarView.initialize", this.model);
                this.render();
        },

        render: function() 
        {

                this.$el.append(this.template({ users: this.model }));
                //console.log(this.model);
                //return this;
        },

        open: function(e) 
        {
                console.log("open.sidebarView", this.model);  
        },  

})

最佳答案

您的方法不是初始化模型 View 的最干净的方法,因为您没有为每个模型初始化一个 View ,但是将 View 分配给模型的方式是遍历模型,并将每个集合项分配给特定 View 。这种方法很麻烦,会导致性能下降,还会导致在 View 中编写大量额外的代码。

最好的方法是使用每个模型一个 View ,这意味着我们集合中的每个模型都有自己的 View 对象来呈现该模式的数据。不过,这并不能消除对迭代集合并填充列表的 View 对象的需要。它仅将每个单独模型的实现移至该模型的 View 。通过这种方法,每个 View 都可以直接引用其模型。

类似这样的事情:

var App = Backbone.View.extend({    

    initialize: function() {
        this.collection = new Documents();
        console.log("this.collection init", this.collection);
        this.listenTo(this.collection, 'add', this.render);
        this.listenTo(this.collection, 'sync', this.renderSidebarModels);
    },

    renderSidebarModels: function(item) {
        this.collection.models.each(function(item) {
            var sidebarView = new DealerView({                    
                model : item
            }, this);

            sidebarView.render();
            _this.$el.append(sidebarView.$el);
        });
    }
});

使用您的方法获取单击的项目的一种方法是使用适当的数据属性:

open: function(e){
    e.preventDefault();
    var id = $(e.currentTarget).data("id");
    var item = this.collection.get(id);
    console.log(item);
},

但正如我所说,这个解决方案不是最好的解决方案,我们被迫根据模型的 id 查找模型。

阅读本文以更好地理解:https://lostechies.com/derickbailey/2011/10/11/backbone-js-getting-the-model-for-a-clicked-element/

关于javascript - 为什么我通过点击获得用户的所有模型而不是一键模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38480505/

相关文章:

javascript - Backbone.js fetch问题(无法立即刷新数据)

javascript - 如何处理主干js中特定目标的点击事件

javascript - 使用下划线模板在backbone.js中渲染

javascript - 从 JavaScript 检测 Youtube 视频状态

backbone.js - Backbone - 将 head 保留在 TableView 中

javascript - 我使用 jQuery 根据屏幕宽度移动元素,但它会创建重复项

javascript - 播放后如何重置 CSS 过渡

node.js - 通过 Express 持续更新 Backbone 模型

javascript - animate() jquery 在我的例子中失败了

javascript - 什么是点的键码?