2011-10-31 92 views
3

我有一個問題,在Stack中有很多其他帖子。但是沒有人解決這個問題,所以我正在回答這個問題。BackboneJs:Uncaught TypeError:undefined不是函數

快速參考: Uncaught TypeError: undefined is not a function rails3/backbone/js


我寫我的第一個應用程序與backBoneJs。這就是我下面的例子:

http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example/

當我執行的代碼:

1 - Uncaught TypeError: Cannot call method 'extend' of undefined (Controller 1ºline) 

2 - Uncaught TypeError: undefined is not a function    (app 6º line) 
App.initapp.js:6 
(anonymous function)/backbone/#:32 
f.extend._Deferred.e.resolveWithjquery-1.6.4.min.js:2 
e.extend.readyjquery-1.6.4.min.js:2 
c.addEventListener.C 

檢查我的代碼:

的Index.html

<html> 
    <head> 
     <title></title> 
     <link href="css/style.css" media="all" rel="stylesheet" type="text/css" /> 
    </head> 

    <body> 
     <h1><a href="#">Editor de Documentos</a></h1> 
     <h2>Backbone + PHP by Lqdi</h2> 

     <div id="notice"></div> 
     <div id="app"></div> 
     <script type="text/javascript" src="js/_libs/jquery-1.6.4.min.js"></script> 
     <script type="text/javascript" src="js/_libs/json2.js"></script> 
     <script type="text/javascript" src="js/_libs/underscore.js"></script> 
     <script type="text/javascript" src="js/_libs/backbone.js"></script> 
     <script type="text/javascript" src="js/_libs/jquery.dotimeout.js"></script> 

     <script type="text/javascript" src="js/app.js"></script> 

     <script type="text/javascript" src="js/controllers/documents.js"></script> 
     <script type="text/javascript" src="js/models/document.js"></script> 
     <script type="text/javascript" src="js/collections/documents.js"></script> 


     <script type="text/javascript" src="js/views/edit.js"></script> 
     <script type="text/javascript" src="js/views/index.js"></script> 
     <script type="text/javascript" src="js/views/notice.js"></script> 

     <script type="text/javascript"> 
      $(function() { 
       App.init(); 
      }); 
     </script> 
    </body> 
</html> 

個類別:

App.Collections.Documents = Backbone.Collection.extend({ 
    model: Document, 
    url: '/documents' 
}); 

控制器:

App.Controllers.Documents = Backbone.Controller.extend({ 
    routes: { 
     "documents/:id":   "edit", 
     "":       "index", 
     "new":      "newDoc" 
    }, 

    edit: function(id) { 
     var doc = new Document({ id: id }); 
     doc.fetch({ 
      success: function(model, resp) { 
       new App.Views.Edit({ model: doc }); 
      }, 
      error: function() { 
       new Error({ message: 'Could not find that document.' }); 
       window.location.hash = '#'; 
      } 
     }); 
    }, 

    index: function() { 
     var documents = new App.Collections.Documents(); 
     documents.fetch({ 
      success: function() { 
       new App.Views.Index({ collection: documents }); 
      }, 
      error: function() { 
       new Error({ message: "Error loading documents." }); 
      } 
     }); 
    }, 

    newDoc: function() { 
     new App.Views.Edit({ model: new Document() }); 
    } 
}); 

型號:

var Document = Backbone.Model.extend({ 
    url : function() { 
     var base = 'documents'; 
     if (this.isNew()) return base; 
     return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id; 
    } 
}); 

瀏覽:

edit.js

App.Views.Edit = Backbone.View.extend({ 
    events: { 
     "submit form": "save" 
    }, 

    initialize: function() { 
     _.bindAll(this, 'render'); 
     this.model.bind('change', this.render); 
     this.render(); 
    }, 

    save: function() { 
     var self = this; 
     var msg = this.model.isNew() ? 'Successfully created!' : "Saved!"; 

     this.model.save({ title: this.$('[name=title]').val(), body: this.$('[name=body]').val() }, { 
      success: function(model, resp) { 
       new App.Views.Notice({ message: msg }); 
       Backbone.history.saveLocation('documents/' + model.id); 
      }, 
      error: function() { 
       new App.Views.Error(); 
      } 
     }); 

     return false; 
    }, 

    render: function() { 
     $(this.el).html(JST.document({ model: this.model })); 
     $('#app').html(this.el); 

     // use val to fill in title, for security reasons 
     this.$('[name=title]').val(this.model.get('title')); 

     this.delegateEvents(); 
    } 
}); 

index.js

App.Views.Index = Backbone.View.extend({ 
    initialize: function() { 
     this.render(); 
    }, 

    render: function() { 
     $(this.el).html(JST.documents_collection({ collection: this.collection })); 
     $('#app').html(this.el); 
    } 
}); 

notice.js

App.Views.Notice = Backbone.View.extend({ 
     className: "success", 
     displayLength: 5000, 
     defaultMessage: '', 

     initialize: function() { 
      _.bindAll(this, 'render'); 
      this.message = this.options.message || this.defaultMessage; 
      this.render(); 
     }, 

     render: function() { 
      var view = this; 

      $(this.el).html(this.message); 
      $(this.el).hide(); 
      $('#notice').html(this.el); 
      $(this.el).slideDown(); 
      $.doTimeout(this.displayLength, function() { 
       $(view.el).slideUp(); 
       $.doTimeout(2000, function() { 
        view.remove(); 
       }); 
      }); 

      return this; 
     } 
    }); 

    App.Views.Error = App.Views.Notice.extend({ 
     className: "error", 
     defaultMessage: 'Uh oh! Something went wrong. Please try again.' 
    }); 

該應用:

var App = { 
    Views: {}, 
    Controllers: {}, 
    Collections: {}, 
    init: function() { 
     new App.Controllers.Documents(); 
     Backbone.history.start(); 
    } 
}; 

回答

5

如果您正在使用骨幹0.5.x的Backbone.Controller更名爲Backbone.Router

從文檔:

Upgrading to 0.5.0+

We've taken the opportunity to clarify some naming with the 0.5.0 release. Controller is now Router, and refresh is now reset. The previous saveLocation and setLocation functions have been replaced by navigate. Backbone.sync's method signature has changed to allow the passing of arbitrary options to jQuery.ajax. Be sure to opt-in to pushState support, if you want to use it.

相關問題