Backbone/Coffeescript中的继承问题



所以我开始使用Backbone/CoffeeScript这个新的应用程序。我使用的是Sinatra后端,所以我的Coffeescript编译器是默认的命令行编译器,它只创建js文件。我试图创建一个应用程序,其中有一个主类,其他类继承。由于某些原因,我得到了一些错误。以下是错误

TypeError: 'undefined' is not an object (evaluating 'n.replace')
TypeError: 'undefined' is not an object (evaluating 'parent.prototype')
TypeError: 'undefined' is not a constructor (evaluating 'new FileApp.UploaderView()')

这是我的基类

class FileApp.Controller extends Backbone.View
template: _.template($('#FileAppTemplate').html())
initialize: (office) ->
    @office = office
    @render()
render:  ->
    # Attach view to DOM
    $('#fileUploaderApp').append(@$el)

bindViews: (uploaderView, fileViewerView, fileDetailView) ->
    @uploaderView = uploaderView
    @fileViewerView = fileViewerView
    @fileDetailView = fileDetailView
下面是一个继承类 的例子
 class FileApp.FileViewerView extends FileApp.Controller 
template: _.template($('#FileViewTemplate').html())
# 
# render ->
# 
render: ->
    @$el.html(@template)
    # Append to fileViewer Div
    @renderFiles()
# 
# createFiles ->
# 
renderFiles: ->

下面是我的。erb文件如何加载每个项目并实例化应用程序。

<script id="namespacing">
    //All backbone classes attach to this variable
    var FileApp={};
</script>
<!-- Underscrore/Backbone -->
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"></script>

<script src="/js/fileUploader/libs/file_app_view.js"></script>
<script src="/js/fileUploader/libs/uploader_view.js"></script>
<script src="/js/fileUploader/libs/file_detail_view.js"></script>
<script src="/js/fileUploader/libs/file_model.js"></script>
<script src="/js/fileUploader/libs/file_viewer_view.js"></script>
<script src="/js/fileUploader/libs/file_view.js"></script>

<div id="fileUploaderApp"></div>
<script>
    $(document).ready(function(){
        var App = new FileApp.Controller();
        // # Create Uploader
        var uploaderView = new FileApp.UploaderView();
        // # Create File Viewer
        var fileViewerView = new FileApp.FileViewerView();
        // # Create File Detail View
        var fileDetailView = new FileApp.FileDetailView();
        App.bindViews(uploaderView, fileViewerView, fileDetailView)
    });
</script>
如果有人能澄清我的问题是什么,那就太好了。

试试这个

@$el.html(@template())

代替

@$el.html(@template)

另外,您还需要将参数传递给模板

@$el.html(@template(parameter1: 'value1', parameter2: 'value2'))

通常在你的视图中有一个模型,如果你的模型是office,这是一个骨干模型,你可以这样做:

@$el.html(@template(var_referencing_office.toJSON()))

这只是一个例子。我不知道你是否同意这个观点

我通过将我的.coffee文件编译成一个.js文件来解决这个问题。继承似乎只是一个能够看到我试图继承的类的问题。由于Coffeescript将所有文件放在闭包中,所以我的类无法访问要继承的其他类。

一开始我试着用命名空间来处理它,但是每个人都知道用coffeescript是多么容易…

最终,我通过制作一个.js文件(无论哪种方式都是更好的结果)来解决它。

如果有人需要将许多文件编译成一个文件,这里是我使用的bash命令。它将一个文件"app.js"放在当前目录的"libs/"目录中,并编译当前目录的"src/"目录中的所有文件。

 coffee --output libs --join app.js --compile --watch src/

感谢大家的帮助。

最新更新