🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## Backbone.Events(事件) **Events** 是一个可以融合到任何对象的模块, 给予 对象绑定和触发自定义事件的能力. Events 在绑定之前 不需要声明, 并且还可以传递参数. 比如: ``` var object = {}; _.extend(object, Backbone.Events); object.on("alert", function(msg) { alert("Triggered " + msg); }); object.trigger("alert", "an event"); ``` 举个例子, 你可以定义一个事件调度程序,然后在你应用的不同地方调用,例如: `var dispatcher = _.clone(Backbone.Events)` **on**`object.on(event, callback, [context])`别名: bind 在 object 上绑定一个**callback**回调函数。 只要**event**触发,该回调函数就会调用。如果你的一个页面含有大量的不同时间,我们约定使用冒号来为事件添加 命名空间 俗成地使用冒号来命名:`"poll:start"`, 或 `"change:selection"`。 事件字符串也可能是用空格分隔的多个事件列表(愚人码头注:即可以同时绑定多个事件,事件用空格分隔)... ``` book.on("change:title change:author", ...); ``` 当回调函数被调用时,通过可选的第三个参数可以为`this`提供一个**context(上下文)**值:`model.on('change', this.render, this)` (愚人码头注:即回调函数中的This,指向传递的第三个参数)。 当回调函数被绑定到特殊"all"事件时,任何事件的发生都会触发该回调函数,回调函数的第一个参数会传递该事件的名称。举个例子,将一个对象的所有事件代理到另一对象: ``` proxy.on("all", function(eventName) { object.trigger(eventName); }); ``` 所有Backbone事件方法还支持事件映射的语法, 作为可惜的位置参数: ``` book.on({ "change:title": titleView.update, "change:author": authorPane.update, "destroy": bookView.remove }); ``` **off**`object.off([event], [callback], [context])`别名: unbi nd 从 object 对象移除先前绑定的 **callback** 函数。如果没有指定**context(上下文)**,所有上下文下的这个回调函数将被移除。如果没有指定callback,所有绑定这个事件回调函数将被移除;如果没有指定event,所有事件的回调函数会被移除。 ``` // Removes just the `onChange` callback. object.off("change", onChange); // Removes all "change" callbacks. object.off("change"); // Removes the `onChange` callback for all events. object.off(null, onChange); // Removes all callbacks for `context` for all events. object.off(null, null, context); // Removes all callbacks on `object`. object.off(); ``` 需要注意的是,调用 `model.off()`,例如,这确实会删除model(模型)上_所有_的事件—包括Backbone内部用来统计的事件。 **trigger**`object.trigger(event, [*args])` 触发给定 **event**或用空格隔开的事件的回调函数。后续传入 **trigger** 的参数会传递到触发事件的回调函数里。 **once**`object.once(event, callback, [context])` 用法跟[on](#Events-on)很像,区别在于绑定的回调函数触发一次后就会被移除(愚人码头注:只执行一次)。简单的说就是“下次不在触发了,用这个方法”。 **listenTo**`object.listenTo(other, event, callback)` 让 **object** 监听 **另一个(other)**对象上的一个特定事件。不使用`other.on(event, callback, object)`,而使用这种形式的优点是:**listenTo**允许 **object**来跟踪这个特定事件,并且以后可以一次性全部移除它们。**callback**总是在**object**上下文环境中被调用。 ``` view.listenTo(model, 'change', view.render); ``` **stopListening**`object.stopListening([other], [event], [callback])` 让 **object** 停止监听事件。如果调用不带参数的**stopListening**,可以移除 **object** 下所有已经[registered(注册)](#Events-listenTo)的callback函数...,或者只删除指定对象上明确告知的监听事件,或者一个删除指定事件,或者只删除指定的回调函数。 ``` view.stopListening(); view.stopListening(model); ``` **listenToOnce**`object.listenToOnce(other, event, callback)` 用法跟 [listenTo](#Events-listenTo) 很像,但是事件触发一次后callback将被移除。 **Catalog of Events(事件目录)** 下面是Backbone 内置事件的完整列表,带有参数。 你也可以在Models(模型),Collection(集合),Views(视图)上自由地触发这些事件,只要你认为合适。 收藏和意见,你认为合适。 `Backbone` 对象本身混入了`Events`,并且可用于触发任何全局事件,只要您的应用程序的需要。 * **"add"** (model, collection, options) — 当一个model(模型)被添加到一个collection(集合)时触发。 * **"remove"** (model, collection, options) — 当一个model(模型)从一个collection(集合)中被删除时触发。 * **"reset"** (collection, options) — 当该collection(集合)的全部内容已被替换时触发。 * **"sort"** (collection, options) — 当该collection(集合)已被重新排序时触发。 * **"change"** (model, options) — 当一个model(模型)的属性改变时触发。 * **"change:[attribute]"** (model, value, options) — 当一个model(模型)的某个特定属性被更新时触发。 * **"destroy"** (model, collection, options) —当一个model(模型)被[destroyed(销毁)](#Model-destroy)时触发。 * **"request"** (model_or_collection, xhr, options) — 当一个model(模型)或collection(集合)开始发送请求到服务器时触发。 * **"sync"** (model_or_collection, resp, options) — 当一个model(模型)或collection(集合)成功同步到服务器时触发。 * **"error"** (model_or_collection, resp, options) — 当一个model(模型)或collection(集合)的请求远程服务器失败时触发。 * **"invalid"** (model, error, options) — 当model(模型)在客户端 [validation(验证)](#Model-validate)失败时触发。 * **"route:[name]"** (params) —  当一个特定route(路由)相匹配时通过路由器触发。 * **"route"** (route, params) — 当_任何一个_route(路由)相匹配时通过路由器触发。 * **"route"** (router, route, params) — 当_任何一个_route(路由)相匹配时通过history(历史记录)触发。 * **"all"** — 所有事件发生都能触发这个特别的事件,第一个参数是触发事件的名称。 一般来说,事件触发(例如model.set,collection.add或者其他事件)后就会执行回调函数,但是如果你想阻止回调函数的执行,你可以传递{silent: true}作为参数。很多时候,这是一个好的方法。通过在回调函数里传输一个特定的判断参数,会让你的程序更加出色。 一般而言,事件触发(`model.set`, `collection.add`,等等...)后就会调用一个函数,但是如果你想阻止事件被触发, 您可以传递`{silent: true}`作为一个选项。注意,这中情况很少, 甚至从来没有, 一个好主意。 通过在选项中传递一个特定的标记,回调函数里传输一个特定的判断参数 并且选择忽略,会让你的程序更加出色。