Backbone.js + Require.js: URL-адрес коллекции установлен, но появляется сообщение об ошибке "Uncaught Error: необходимо указать свойство или функцию url"

В настоящее время я работаю над фреймворком для проекта, который мы разделили на код веб-клиента и сервера. Код клиента использует комбинацию require.js и backbone.js. В настоящее время я работаю над настройкой связи между клиентом и сервером, и в идеале мы хотели бы иметь возможность использовать встроенную функциональность магистрали.sync (и извлеченный из нее вызов fetch).

Тем не менее, я сталкиваюсь с нечетной серией ошибок.

Когда код выполняется, я получаю следующую ошибку в консоли. "Uncaught Error: необходимо указать свойство или функцию 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); } не имеет метода 'trigger'".

Я также пытался добавить "SERVICES/" и "../SERVICES/" перед свойством url коллекции или указав полное и явное свойство URL (вплоть до http://), но ничего из этого работал тоже.

Может кто-нибудь помочь мне понять, почему я вижу эту ошибку?

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); } Часть конструктор вашего класса, так что это дает вам подсказку о том, что происходит.

Другие вопросы по тегам