5

我使用 Backbone.js 创建了一个 web 应用程序,所有视图、集合和模型都写入一个 js 文件,它成功了!

现在我想将它们分成不同的 js 文件,就像:

<script type="text/javascript" src="js/layermanagemodel.js"></script>       
<script type="text/javascript" src="js/layermanagecollection.js"></script>  
<script type="text/javascript" src="js/layermanageview.js"></script>    
<script type="text/javascript" src="js/boot.js"></script>

并在 jquery 加载中加载模型代码:

$(function(){
    //Model
        var manageModel = Backbone.Model.extend({
                default:{
                    'selectedId':'unknow'
                },
                selectLayer:function(uuid){
                     this.set({"selectedId": uuid});
                },
                delLayer:function(){

                }
        }); 
})

但萤火虫告诉我错误:

manageModel is not defined
[Break On This Error]   

model: manageModel

在收集文件中

为什么如果将它们分开到不同的文件中,它们无法相互识别?我该如何解决这个问题?或者什么是正确的加载顺序?谢谢

4

2 回答 2

9

添加函数包装器后:

$(function() {
    // ...
})

您已经引入了新的作用域,并且var在这些函数中声明的所有 s 仅在这些函数中可见。您可以通过将它们设为全局(即 的属性window)来解决此问题:

$(function(){
    window.manageModel = Backbone.Model.extend({
        //...
    });
});

或者更好的是,引入一个应用程序命名空间:

$(function(){
    window.app = window.app || { };
    window.app.manageModel = Backbone.Model.extend({
        //...
    });
});

然后通过以下方式引用app事物app.manageModel

$(function(){
    window.app = window.app || { };
    window.app.someCollection = Backbone.Collection.extend({
        model: app.manageModel,
        //...
    });
});
于 2012-05-18T04:00:00.193 回答
3

您还可以考虑使用Require.js使您的 js 文件模块化。工作得非常好,只会在需要时加载视图、模型和集合。如果您的应用程序非常大,建议您这样做。它将阻止您在页面加载时加载所有脚本。一个快速的backbone.js 实现如下:

define([
    'jquery',
    'underscore',
    'backbone',
    'models/post'
], function ($, _, Backbone, Post) {
    "use strict";
    var PostsCollection = Backbone.Collection.extend({
        model: Post,
        url: CONFIG.apiUrl + 'posts'
    });
    return PostsCollection;
});

上面是一个采集模块。您可以看到“模型/帖子”指向另一个模块的位置。jquery、下划线和主干是在我的配置中定义的,所以我只需要传递它们而不是指向它们的实际位置。这是一个简短的介绍,但如果你想分离你的 js 文件,Require.js是一种方式。

于 2012-05-18T06:40:22.223 回答