|
|
@@ -15,7 +15,7 @@ var uid = 0
|
|
|
* @param {Vue} vm
|
|
|
* @param {String} expression
|
|
|
* @param {Function} cb
|
|
|
- * @param {Object} [ctx]
|
|
|
+ * @oaram {Object} ctx
|
|
|
* @param {Array} [filters]
|
|
|
* @param {Boolean} [needSet]
|
|
|
* @constructor
|
|
|
@@ -24,8 +24,8 @@ var uid = 0
|
|
|
function Watcher (vm, expression, cb, ctx, filters, needSet) {
|
|
|
this.vm = vm
|
|
|
this.expression = expression
|
|
|
- this.cb = cb // change callback
|
|
|
- this.ctx = ctx || vm // change callback context
|
|
|
+ this.cbs = [cb]
|
|
|
+ this.ctxs = [ctx]
|
|
|
this.id = ++uid // uid for batching
|
|
|
this.value = undefined
|
|
|
this.active = true
|
|
|
@@ -173,11 +173,46 @@ p.run = function () {
|
|
|
) {
|
|
|
var oldValue = this.value
|
|
|
this.value = value
|
|
|
- this.cb.call(this.ctx, value, oldValue)
|
|
|
+ var cbs = this.cbs
|
|
|
+ var ctxs = this.ctxs
|
|
|
+ for (var i = 0, l = cbs.length; i < l; i++) {
|
|
|
+ cbs[i].call(ctxs[i], value, oldValue)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Add a callback.
|
|
|
+ *
|
|
|
+ * @param {Function} cb
|
|
|
+ * @param {Object} ctx
|
|
|
+ */
|
|
|
+
|
|
|
+p.addCb = function (cb, ctx) {
|
|
|
+ this.cbs.push(cb)
|
|
|
+ this.ctxs.push(ctx)
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Remove a callback.
|
|
|
+ *
|
|
|
+ * @param {Function} cb
|
|
|
+ */
|
|
|
+
|
|
|
+p.removeCb = function (cb) {
|
|
|
+ var cbs = this.cbs
|
|
|
+ if (cbs.length > 1) {
|
|
|
+ var i = cbs.indexOf(cb)
|
|
|
+ if (i > -1) {
|
|
|
+ cbs.splice(i, 1)
|
|
|
+ this.ctxs.splice(i, 1)
|
|
|
+ }
|
|
|
+ } else if (cb === cbs[0]) {
|
|
|
+ this.teardown()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* Remove self from all dependencies' subcriber list.
|
|
|
*/
|
|
|
@@ -189,6 +224,7 @@ p.teardown = function () {
|
|
|
for (var path in this.deps) {
|
|
|
vm._bindings[path]._removeSub(this)
|
|
|
}
|
|
|
+ this.vm = this.cbs = this.ctxs = null
|
|
|
}
|
|
|
}
|
|
|
|