【问题标题】:Backbone.js + Require.js: Collection URL set, but getting error "Uncaught Error: A "url" property or function must be specified"Backbone.js + Require.js:集合 URL 已设置,但出现错误“未捕获的错误:必须指定“url”属性或函数”
【发布时间】:2014-05-07 21:33:48
【问题描述】:

我目前正在为一个项目开发框架,该项目已拆分为 Web 客户端和服务器代码。 客户端代码使用了 require .js 和backbone.js 的组合。 我目前正在设置客户端/服务器通信,理想情况下,我们希望能够使用骨干网内置的 .sync 功能(以及由此构建的 fetch 调用)。

但是,我遇到了一系列奇怪的错误。

当代码执行时,我在控制台中收到以下错误。 “未捕获的错误:必须指定“url”属性或函数”

这些是我们 main.js 中的相关垫片

require.config({
    paths: {
        'jQueryBase': '../vendor/jquery-1.10.2/jquery-1.10.2',
        'jQuery': '../vendor/jquery-ui-1.10.3/ui/jquery-ui',
        'underscore': '../vendor/underscore/underscore',
        'backbone': '../vendor/backbone/backbone',
        'handlebars': '../vendor/handlebars/handlebars-v1.1.2 '
    },
    shim: {
        'jQuery': {
            exports: '$',
            deps: ['jQueryBase']
        },
        'underscore': {
            exports: '_'
        },
        'backbone': {
            exports: 'Backbone',
            deps: ['underscore', 'jQueryBase']
        },
        'handlebars': {
            exports: 'Handlebars'
        }
    },
    waitSeconds: 0
});

这是我们的 dogModel.js

define(['backbone'],
    function (Backbone) var DogModel = Backbone.Model.extend({

    });

    return DogModel;
});

这是我们的 dogCollection.js

define {
    ('backbone',
        '../models/dogModel'
        J,
        function (Backbone,
            DogModel) {

            var DogCollection = Backbone.Collection.extend({
                model: DogModel,
                url: '/dogs',
            });

            return DogCollection;
        });

这是我们的 dogData.js

define(['../collections/dogCollection',
        '../models/dogModel'
    ],
    function (DogCollection,
        DogModel) {

        var dogDataModule = {};

        dogDataModule.dogList = new DogCollection();

        //this request works
        $.ajax(
            type: "GET",
            dataType: "json",
            url: "http://localhost:7001/SERVICES/dogs",
            success: function (data) {
                dogDataArray = data;

                for (var i = 0; i < dogDataArray.length; i++) {
                    var dogData = dogDataArray[i];
                    var dogModel = new DogModel();
                    dogModel.set(dogData);
                    dogDataModule.dogList.add(dogModel);
                }
            }
        });

    //this request doesn't
    dogDataModule.dogList.sync('read', DogCollection, {
            success: function () {
                alert("success ");
            },
            error: function () {
                alert("failure ");
            }
        };

        return dogDataModule;
    });

我尝试将 URL 直接添加到同步请求的选项中,如下所示:

dogDataModule.dogList.sync('read', DogCollection, {
        url: 'http://localhost:7001/SERVICES/dogs',
        success: function () {
            alert("success");
        },
        error: function () {
            alert("failure "
            };
        });

但这所做的只是将错误更改为“Uncaught TypeError : Object function (){ return parent.apply(this, arguments); } 没有方法“触发器”。

我还尝试在集合的 url 属性前添加“SERVICES/”和“../SERVICES/”,或者提供完整且明确的 URL 属性(直到并包括 http://),但是这些都没有奏效。

谁能帮我弄清楚为什么我会看到这个错误?

【问题讨论】:

    标签: javascript backbone.js requirejs backbone.js-collections


    【解决方案1】:

    首先,我认为你没有任何理由直接调用dogList.sync(你可以使用dogList.fetch,除了服务器调用之外,你当然想要fetch为你提供的功能。

    现在,您的错误来自您错误地使用了sync。第二个参数是一个集合的实例,而不是一个类,如fetch的代码所示:

    return this.sync('read', this, options);
    

    所以在你的情况下,那就是:

    dogDataModule.dogList.sync('read', dogDataModule.dogList
    

    奖金:

    错误Uncaught TypeError : Object function (){ return parent.apply(this, arguments); } has no method 'trigger 来自Backbone 试图应用您的类的方法trigger 而不是实例。 function (){ return parent.apply(this, arguments); } 部分是您的类的构造函数,因此可以提示您正在发生的事情。

    【讨论】:

    • 谢谢。我使用 dogDataModule.dogList 而不是 DogCollection,我不再看到错误消息,我还从调用中获得了成功警报,并且可以验证我尝试传回的数据是否在数组中。您的解释清晰、简洁且易于理解。我知道 fetch 更简单,但除此之外,我不确定它在我可能想要利用的同步之外还给了我什么。我会进一步研究它,但如果你能给我一些例子,我将不胜感激。
    • 好吧,fetch 会根据服务器的响应自动创建你的模型,你不需要做任何事情(Backbone 将使用你的集合的模型属性来填充它)。您可以随时查看 Backbone 的代码以更好地了解这些方法的作用,这很容易理解(尤其是带注释的源代码)。
    • 谢谢。此外,它会关闭我看到的数据数组来自非简化代码中的不同来源。我将研究为什么我实际上没有得到数组响应,然后研究将其转换为 fetch 命令。
    • 这应该和使用dogDataModule.dogList.fetch() 一样简单:)
    • 确实如此。我切换了“.sync('read',dogDataModule.dogList”,切换到“.fetch(”并开始工作。但我仍然不完全明白为什么会这样。是“if(!model。 set(model.parse(resp, options), options)) return false;"?为了自信地理解我正在使用的代码,我还有更多工作要做。
    猜你喜欢
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多