2

我正在尝试在 Backbone 应用程序中使用 CommonJS 模块,所以我有一个骨架 Backbone 视图定义在/views/categories/edit.js

app.Views.quoteCategoriesEdit = app.Ui.ModalView.extend({

    className: '',

    template: JST["templates/quotes/categories/quote-categories-edit.html"],
    events: {
        'click [data-key="save"]': 'save',
        'click [data-key="cancel"]': 'cancel'
    },
    initialize: function (options) {
        var that = this;
        _.bindAll(this, 'save', 'cancel');
        app.Collections.quotesCategories.on('change add', function () {
            that.remove();
        });
    },

    render: function () {
        var that = this;
        // boilerplate render code
        return this;
    }

});

如果有人能告诉我如何将其转换为 CommonJS 模块以与 Browserify 一起使用,那么我将非常感激,它真的会帮助我理解如何模块化应用程序的其余部分!谢谢

4

1 回答 1

7
//once you get things into folders/files, this path may change
//but for now I'm assuming all your views will live in the same directory 
var ModalView = require('./modal-view');

var QuoteCategoriesEdit = ModalView.extend({

    className: '',

    template: JST["templates/quotes/categories/quote-categories-edit.html"],
    events: {
        'click [data-key="save"]': 'save',
        'click [data-key="cancel"]': 'cancel'
    },
    initialize: function (options) {
        var that = this;
        _.bindAll(this, 'save', 'cancel');
        app.Collections.quotesCategories.on('change add', function () {
            that.remove();
        });
    },

    render: function () {
        var that = this;
        // boilerplate render code
        return this;
    }

});
//Simplest convention is just 1-class-per-module
//Just export the constructor function
module.exports = QuoteCategoriesEdit;

评论中的后续问题:

非常感谢!您将如何处理:app.Collections.quotesCategories,因为我将所有内容都存放在 app 命名空间下?我只需要集合本身吗?

所以“app”命名空间的想法与模块化/commonjs/browserify/requirejs 是相反的。你不再需要app对象了。任何需要创建此集合的新实例的模块都可以,仅此而已var QuotesCategories = require('app/collections/quotes-categories');。不再有全局变量或命名空间对象。大多数情况下,您的视图将在其构造函数中获得所需的模型/集合options。您的大多数模型将通过调用fetch集合来创建,并且您的大多数集合将由您的路由器实例化。

哦,是的,在这个特定示例中,最好是非视图代码创建集合并通过构造函数options.collection参数将其传递给视图。但是,如果您决定是,您真的希望您的视图实例化集合,它不会来自app全局命名空间对象,它只会来自require您在评论中描述的调用。

于 2013-07-15T17:50:00.450 回答