【问题标题】:URL of collection is specified but it returns error指定了集合的 URL,但它返回错误
【发布时间】:2026-02-17 04:40:01
【问题描述】:

我在 myapp.com/groups 上有一个集合,如下所示:

[   {
    "_id": "52dd2bd1044bf96a12ed2319",
    "name": "US",
    "id": 1,
    "users": []   },   {
    "_id": "52dd2bd1044bf96a12ed231b",
    "name": "BR",
    "id": 3,
    "users": []   },   {
    "_id": "52dd2bd1044bf96a12ed231c",
    "name": "SK",
    "id": 4,
    "users": []   },   {
    "_id": "52dd2bd1044bf96a12ed231d",
    "name": "CZ",
    "id": 5,
    "users": []   },   {
    "_id": "52dd2bd2044bf96a12ed231e",
    "name": "UK",
    "id": 6,
    "users": []   } ]

然后我有骨干模型和集合:

Group = Backbone.Model.extend({
        urlRoot: 'groups',
    });

Groups = Backbone.Collection.extend({
        url: 'groups',
        model: Group
    });

我想创建一个这样的集合实例:

groups = new Groups();

groups.fetch();

但我总是得到一个错误:

未捕获的类型错误:对象 [object Object] 的属性“url”不是函数

【问题讨论】:

  • 你可以尝试在url: '/groups',前面加斜线
  • 你有没有重写 Collection 的同步方法?我认为可能有错误。
  • 我没有覆盖 Collection 的同步并有一个斜线 url: '/groups',但错误仍然是一样的。
  • 你使用什么Backbone 插件?
  • 我正在使用backbone.maironette 和backbone.syphon。

标签: javascript backbone.js marionette


【解决方案1】:

试试这个

javascript

var Group = Backbone.Model.extend({});
var Groups = Backbone.Collection.extend({
    model: Group,
    url: "groups",
    parse: function(data) {
        return data;
    }
});
var GroupView = Backbone.View.extend({
    el: $("#page"),
    initialize: function() {
    },
    render: function() {
        var that = this;
        this.collection = new Groups();
        this.collection.fetch({
            type: "GET",
            contentType: 'application/json',
            dataType: "json",
            success: function(collection, response) {
                var template = _.template(yourViewTemplate, {
                    groups: that.collection.models
                });
                that.$el.html(template);
            },
            error: function(collection, response) {
                alert("error");
            }
        });

    }
});

html

<% _.each(groups, function(group) { %>
   <%= group.get('_id') %>
   <%= group.get('name') %>
   <%= group.get('id') %>
<% }); %>

【讨论】:

    【解决方案2】:

    正如 Puigcerber 所指出的,最可能的原因是您没有在您的网址 (groups) 前加上正斜杠。 Backbone 对一些事情非常固执己见,url 属性就是其中之一。尝试将Groups 集合的url 属性更新为/groups

    正如 Rocky Lee 所说,这可能是一个意外的 Backbone.Sync 覆盖,但我敢打赌我的车是 url 属性激怒了骨干之神。

    【讨论】:

    • 我有斜线 url: '/groups',我使用的是新下载的 Backbone.js 和 Marionette.js,我没有在我的应用程序中扩展 Backbone.Sync。
    • 有趣...我从未使用过 Marionette.js,尽管我很想这样做。如果我现在是你,我会通过从应用程序中删除所有复杂性来开始调试。禁用/注释掉 Marionette 并使用运行您的应用所需的绝对最小值进行尝试。如果不取出所有变量,调试起来要困难得多。
    • 我仍然有一个错误 - Uncaught TypeError: Property 'url' of object [object Object] 不是一个函数。
    • 我开始认为这是因为您同时定义了urlRooturl。 Backbone 对 REST API 设计很有意见,它会根据提供给集合的url 属性自动构建模型 URL。在该过程中自动分配模型的url 属性很容易与模型的urlRoot 属性冲突。 @ladislav_prague