Backbone.js + Require.js:收集URL设置,但收到错误“未捕获错误:必须指定”url“属性或函数”

时间:2014-05-07 21:33:48

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

我目前正在研究一个项目的框架,我们将其拆分为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://),但是这些都没有奏效。

任何人都可以帮我弄清楚为什么我会看到这个错误吗?

1 个答案:

答案 0 :(得分:2)

首先,我不认为您有任何理由直接致电dogList.sync(您可以使用dogList.fetch,您当然需要这些功能{{1}除了服务器调用之外,它还为您提供。

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

fetch

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

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

加成:

错误dogDataModule.dogList.sync('read', dogDataModule.dogList 来自Backbone尝试应用您的类的Uncaught TypeError : Object function (){ return parent.apply(this, arguments); } has no method 'trigger方法而不是实例的事​​实。 trigger部分是您班级的构造函数,因此可以提示您发生了什么。