2014-06-16 55 views
0

我试图在项目中一起使用RequireJS,Backbone,Firebase和Backfire,并且真的很难入门。下面是一个简单的例子:如何将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' })); 
}); 

任何帮助,您可以提供将不胜感激。

+0

我相当肯定的是,由于火力地堡内部做了自己的一些要求,你需要等待火力地堡对象被实例化。 Requirejs有一个测试方法(我不记得语法)等待一个对象在被认为被加载之前初始化。你需要利用它。 – Kato

+0

@加藤下午好。在** test.js **中执行定义回调函数时,'Firebase''完全实例化。我通过完全绕过''Backbone''',创建一个'''新的Firebase'''并设置一个测试值来测试它。请看我修改的问题。 – mjhasbach

回答

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') 
    }); 
}); 
3

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

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

谢谢!这帮助了很多,但是我不能像你的例子那样在相同的任务中定义和实例化'''database''。我必须做'''var database = Backbone.Firebase.Collection.extend(...)''',然后''var db = new database'''才能运行。如果你能在你的回答中解决这个问题,我会接受它。我是Backbone的新手,并且很想知道这个“问题”是否仅限于“Backbone.Firebase.Collection”或所有Backbone集合。 – mjhasbach