Backbone - 无法读取未定义的属性'get'

时间:2014-06-23 14:19:37

标签: javascript backbone.js underscore.js

这是我第一次真正尝试使用服务器端点创建Backbone应用程序,我发现自己陷入了困境。

我的html中有一个下划线模板:

    <tbody>
      <% _.each(users, function(user) { %>
        <tr>
          <td><% user.get('firstname') %></td>
          <td><% user.get('lastname') %></td>
          <td><% user.get('age') %></td>
          <td></td>
        </tr>
      <% }); %>
    </tbody>

我在这里是我的模特/观点/集合:

var Users = Backbone.Collection.extend({
        url: '/UMA.Service/Service1.svc/',
        Model: User
    });

var User = Backbone.Model.extend({
    defaults: {
        "firstname": "",
        "lastname": "",
        "age": null
    }
});

var UserList = Backbone.View.extend({
    el: '.page',
    render: function() {
        console.log(this.collection.toJSON());
        var template = _.template($('#user-list-template').html(), {users: this.collection.model});
        this.$el.html(template);

    }, 
    initialize: function() {    
        var that = this;        
        this.collection = new Users();
        this.collection.fetch({
            success: function(User) {
                that.render();
            }
        });

    }
});

我不确定我搞砸了哪里。我认为它可能必须是我在我的集​​合或模型中调用的东西,但我已经找了一段时间,如果有的话就找不到它。有人能帮助我吗?

我的控制台登录视图中的渲染功能,并返回我的所有数据,所以我看不出为什么这不起作用。有没有人有任何想法?

2 个答案:

答案 0 :(得分:2)

而不是:

_.each(users, function(user) {...

尝试做:

users.each(function(user) { ...

Backbone“代理”各种下划线方法到主干对象(在本例中为Collection对象)。有关详细信息,请查看以下内容:http://backbonejs.org/#Collection-Underscore-Methods并向下滚动一些示例。

编辑:

@Bojangels是对的。您也不希望将this.collection.model传递给模板。你只想通过集合(在这种情况下)。该集合“包含”您关注的模型。 Collection.model是集合中的一个属性,它表示集合包含的模型类型,而不是模型本身的特定实例。

正如@Tallmaris在下面的评论中所述,这个难题的缺失部分是使用<%=来输出值:

  <td><%= user.get('firstname') %></td>

答案 1 :(得分:0)

您未正确将集合传递给模板。你需要这样做.collection.toJSON() 您的渲染功能应如下所示

render: function() {
        console.log(this.collection.toJSON());
        var template = _.template($('#user-list-template').html(), {users: this.collection.toJSON()});
        this.$el.html(template);

}