0

Backbone + Coffeescript + Rails は初めてで、アプリケーションの初期化に行き詰まっています。main_app.js.coffee は次のとおりです。

#= require_self
#= require_tree ./templates
#= require_tree ./models
#= require_tree ./views
#= require_tree ./routers

class window.BackofficeApp
  Models: {}
  Collections: {}
  Routers: {}
  Views: {}

  sanity:-> true

  constructor: ->
        console.log "go backofficeapp!"
        new BackofficeApp.Router()
        try
            Backbone.history.start()

ルーターはまだ非常に単純です。

class BackofficeApp.Router extends Backbone.Router

    routes:
        "": "index",
        "users": "users",
        "csense": "csense"

    index: ->
        console.log "index called from router!"
        view = new BackofficeApp.Views.IndexView()
        $('#main-app').html(view.render().el)

    users: ->
        console.log "users"

    csense: ->
        console.log "contentsense!"

そしてIndexViewも:

class BackofficeApp.Views.IndexView extends Backbone.View    

    render: ->
        template = JST['index_view']
        $(@el).html(template);
        console.log "index called from indexview!"
        this

すべては jQuery から始まります (ドキュメントの準備ができています):

jQuery ->
    new BackofficeApp()

しかし、コンソールに次のメッセージ/エラーが表示されます。

Uncaught TypeError: Cannot read property 'IndexView' of undefined
go backofficeapp!
index from router! 

IndexView クラス宣言から .Views を取り出すと、機能します...ただし、アプリは中規模から大規模であるため、クラスの命名には 2 つ (またはそれ以上) のレベルを使用したいと考えています。

私たちは何を間違っていますか?

4

1 に答える 1

1

これはあなたが思っていることをしません:

class window.BackofficeApp
  Models: {}
  Collections: {}
  Routers: {}
  Views: {}

それは作成しますwindow.BackofficeAppModels、 、 ... はそれ自体ではなくCollectionsに添付され ます。JavaScript バージョンは次のようになります。BackofficeApp.prototypeBackofficeApp

window.BackofficeApp = (function() {
  function BackofficeApp() {}
  BackofficeApp.prototype.Models = {};
  BackofficeApp.prototype.Collections = {};
  BackofficeApp.prototype.Routers = {};
  BackofficeApp.prototype.Views = {};
  return BackofficeApp;
})();

私はあなたが作りたいと思うModelsと友達クラスのプロパティ:

class window.BackofficeApp
  @Models: {}
  @Collections: {}
  @Routers: {}
  @Views: {}

BackofficeApp.Models、 、 ...が作成されるBackofficeApp.Collectionsので、次のように言えます。

class BackofficeApp.Views.IndexView extends Backbone.View
  #...

sを見ずにTypeError

于 2012-12-10T06:15:45.577 に答える