创建一个Backbone插件(迎合AMD / Require.js)

时间:2013-05-30 10:49:05

标签: backbone.js

我有几个主干的重写,如

Backbone.Model.prototype.validate = function(data) {...}

在我的项目中运作良好。我想将它们导出到一个新文件中,以便在需要时可以被其他项目使用。我不知道如何解决这个问题,我不确定是否应将它们包装在define中。

有关如何执行此操作的任何帮助?

2 个答案:

答案 0 :(得分:1)

我建议你看一下UMD (Universal Module Definition) project,它旨在提供用于定义在浏览器以及大多数常见脚本加载器中工作的javascript模块的约定。

为了支持RequireJS(AMD)以及浏览器全局变量,您可能希望特别注意UMD的AMD/web语法。

以下是依赖于Backbone的介体模块的示例,该模块可以使用或不使用RequireJS:

(function (root, factory) { return typeof define === 'function' && define.amd ? define(['backbone'], factory) : (root.mediator = factory(root.Backbone)); }(this,
    function (Backbone) {

    var events = Backbone.Events;

    /**
     * Mediator provides a decoupled communication mechanism.
     * Borrows the implementation from Backbone.
     */
    return {

        //expose the on/off/trigger for native Backbone listenTo/stopListening support.
        on:             events.on,
        off:            events.off,
        trigger:        events.trigger,

        //expose subscribe/unsubsribe/publish aliases for idiomatic mediator pattern interface
        subscribe:      events.on,
        unsubscribe:    events.off,
        publish:        events.trigger
    };
}));

我通常将模块声明压缩到如上所述的单行代码,但请参阅UMD的AMD / web-sample以获得相同的注释版本。

答案 1 :(得分:0)

假设您拥有文件中所有模型的所有角色(libs/validation/rules)。

如果您已经使用了require.js:

// model/user.js
define([
      'libs/validation/rules'    
], function(ValidationRules) {

    return Backbone.Model.extend({
        validate: Validation.User  
    })
})

否则,您可以使用全局对象导出验证规则(不好的主意,但它有效):

// model/user.js
Backbone.Model.extend({
    validate: window.Validation.User  
})