Javascript Backbone.js+;Require.js:集合URL已设置,但获取错误“;未捕获错误:A";url";必须指定属性或功能";

Javascript Backbone.js+;Require.js:集合URL已设置,但获取错误“;未捕获错误:A";url";必须指定属性或功能";,javascript,backbone.js,requirejs,backbone.js-collections,Javascript,Backbone.js,Requirejs,Backbone.js Collections,我目前正在为一个项目开发框架,我们已经将该项目分解为一个web客户端和服务器代码。 客户端代码使用require.js和backbone.js的组合。 我目前正在设置客户机/服务器通信,理想情况下,我们希望能够使用主干网的内置.sync功能(以及基于它构建的获取调用) 然而,我遇到了一系列奇怪的错误 当代码执行时,我在控制台中得到以下错误。未捕获错误:必须指定“url”属性或函数 这些是main.js中的相关垫片 require.config({ paths: { 'jQ

我目前正在为一个项目开发框架,我们已经将该项目分解为一个web客户端和服务器代码。 客户端代码使用require.js和backbone.js的组合。 我目前正在设置客户机/服务器通信,理想情况下,我们希望能够使用主干网的内置.sync功能(以及基于它构建的获取调用)

然而,我遇到了一系列奇怪的错误

当代码执行时,我在控制台中得到以下错误。未捕获错误:必须指定“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;
    });
但所有这些都只是将错误改为“uncaughttypeerror:objectfunction(){return parent.apply(this,arguments);}没有方法“trigger”

我还尝试在集合的url属性前面添加“SERVICES/”和“./SERVICES/”,或者提供完整的显式url属性(包括http://),但这些都不起作用


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

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

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

return this.sync('read', this, options);
所以在你的情况下,那就是:

dogDataModule.dogList.sync('read', dogDataModule.dogList
奖金:


错误
uncaughttypeerror:Object函数(){return parent.apply(this,arguments);}没有方法'trigger
源于主干网试图应用类的方法
trigger
,而不是实例。
function(){return parent.apply(this,arguments);}
part是类的构造函数,因此可以为您提供发生的情况的提示。

谢谢。我使用了dogDataModule.dogList而不是DogCollection,我不再看到错误消息,我还从调用中得到了一个成功警报,可以验证我试图传回的数据是否在数组中。您的解释很清楚、简洁,而且很容易理解。我知道fetch比较简单,但除此之外,我不确定它在同步之外还为我提供了哪些我可能想要利用的优势。我将进一步研究它,但如果您能给我一些示例,我将不胜感激。fetch将根据服务器的响应自动创建您的模型,您不会这么做您不必做任何事情(主干将使用集合的model属性来填充它)。您可以随时检查主干的代码,以便更好地了解方法的作用,这是非常容易理解的(尤其是带注释的源代码)。谢谢。另外,它关闭了我在非简化代码中看到的来自不同来源的数据数组。我将研究为什么我实际上没有得到数组响应,然后研究如何将其转换为fetch命令。这应该像使用
dogDataModule.dogList.fetch()
:)一样简单。我关掉了“.sync('read',dogDataModule.dogList)”,换上了“.fetch”(“它开始工作了。但我仍然不完全明白为什么会这样。这是不是行”如果(!model.set(model.parse(resp,options),options))返回false;“?为了自信地理解我正在使用的代码,我还有更多的挖掘工作要做。
dogDataModule.dogList.sync('read', dogDataModule.dogList