如何在Backbone,Firebase和Backfire中使用RequireJS

时间:2014-06-16 01:29:46

标签: javascript backbone.js requirejs firebase

我正在尝试在项目中同时使用RequireJS,Backbone,Firebase和Backfire,并且我很难开始使用。这是一个简单的例子:

main.js

require.config({
    paths: {
        backbone: 'backbone',
        backfire: 'backfire',
        firebase: 'firebase',
        underscore: 'underscore',
        jquery: 'jquery',

        test: 'test'
    },

    shim: {
        'firebase': {
            exports: 'Firebase'
        },

        'underscore': {
            exports: '_'
        },

        'backbone': {
            deps: [ 'underscore', 'jquery' ],
            exports: 'Backbone'
        },

        'backfire': {
            deps: [ 'backbone', 'firebase', 'underscore' ]
        }
    }
});

requirejs([ 'test' ]);

test.js

define([ 'backbone', 'firebase', 'backfire' ], function( Backbone, Firebase ){
    var Person = Backbone.Model.extend({
        defaults: function() {
            return {
                fName: 'John',
                lName: 'Doe'
            };
        }
    });

    var database = Backbone.Firebase.Collection.extend({
        model: Person,

        firebase: new Firebase( 'https://ref.firebaseio.com' )
    });

    console.log( typeof database ); // function

    // The following throws "Uncaught TypeError: undefined is not a function"
    database.add( new Person({ fName: 'Matthew', lName: 'Hasbach' }));
});

非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:3)

您需要首先实例化您的收藏(使用new)。

var database = new Backbone.Firebase.Collection.extend({
    model: Person,
    firebase: new Firebase( 'https://ref.firebaseio.com' )
});

答案 1 :(得分:1)

正如jgillich在他的回答中所说,我没有实例化Backbone.Firebase.Collection。但是,需要注意的是,在Backbone中,为了在同一个赋值中定义和实例化集合,不能使用extend方法。相反,必须使用new Backbone.Collection。这也适用于其他Backbone对象,如模型。

然而Backbone.Firebase.Collection的定义和实例化(在撰写本文时)必须分成单独的作业。似乎不支持new Backbone.Firebase.Collection。这是一个例子:

<强> test.js

define([ 'backbone', 'firebase', 'backfire' ], function( Backbone, Firebase ){
    var Person = Backbone.Model.extend({
        defaults: function() {
            return {
                fName: 'John',
                lName: 'Doe'
            };
        }
    });

    var Database = Backbone.Firebase.Collection.extend({
        model: Person,

        firebase: new Firebase( 'https://ref.firebaseio.com' )
    });

    var db = new Database;

    // Success!
    db.add( new Person({ fName: 'Matthew', lName: 'Hasbach' }));

    // Uncaught TypeError: Cannot read property 'ref' of undefined
    var nope = new Backbone.Firebase.Collection({
        model: Person,

        firebase: new Firebase( 'https://ref.firebaseio.com' )
    });
});