Ejemplo n.º 1
0
  _fixComponentPaths: function(c) {
    if (!this._listeners) {
      return;
    }
    if (c.na !== undefined || c.si !== undefined || c.sd !== undefined) {
      return;
    }

    var to_remove = [];
    var _ref = this._listeners;

    for (var i = 0; i < _ref.length; i++) {
      var l = _ref[i];
      var dummy = {
        p: l.path,
        na: 0
      };
      var xformed = type.transformComponent([], dummy, c, 'left');
      if (xformed.length === 0) {
        to_remove.push(i);
      } else if (xformed.length === 1) {
        l.path = xformed[0].p;
      } else {
        throw new Error("Bad assumption in json-api: xforming an 'na' op will always result in 0 or 1 components.");
      }
    }

    to_remove.sort(function(a, b) {
      return b - a;
    });

    var _results = [];
    for (var j = 0; j < to_remove.length; j++) {
      i = to_remove[j];
      _results.push(this._listeners.splice(i, 1));
    }

    return _results;
  },
Ejemplo n.º 2
0
  _onOp: function(op) {
    for (var i = 0; i < op.length; i++) {
      var c = op[i];
      this._fixComponentPaths(c);

      if(c.lm !== undefined) {
        this._updateSubdocPaths([c]);
      }

      var match_path = c.na === undefined ? c.p.slice(0, c.p.length - 1) : c.p;

      for (var l = 0; l < this._listeners.length; l++) {
        var listener = this._listeners[l];
        var cb = listener.cb;

        if (pathEquals(listener.path, match_path)) {
          switch (listener.event) {
            case 'insert':
              if (c.li !== undefined && c.ld === undefined) {
                cb(c.p[c.p.length - 1], c.li);
              } else if (c.oi !== undefined && c.od === undefined) {
                cb(c.p[c.p.length - 1], c.oi);
              } else if (c.si !== undefined) {
                cb(c.p[c.p.length - 1], c.si);
              }
              break;
            case 'delete':
              if (c.li === undefined && c.ld !== undefined) {
                cb(c.p[c.p.length - 1], c.ld);
              } else if (c.oi === undefined && c.od !== undefined) {
                cb(c.p[c.p.length - 1], c.od);
              } else if (c.sd !== undefined) {
                cb(c.p[c.p.length - 1], c.sd);
              }
              break;
            case 'replace':
              if (c.li !== undefined && c.ld !== undefined) {
                cb(c.p[c.p.length - 1], c.ld, c.li);
              } else if (c.oi !== undefined && c.od !== undefined) {
                cb(c.p[c.p.length - 1], c.od, c.oi);
              }
              break;
            case 'move':
              if (c.lm !== undefined) {
                cb(c.p[c.p.length - 1], c.lm);
              }
              break;
            case 'add':
              if (c.na !== undefined) {
                cb(c.na);
              }
          }
        }

        if (type.canOpAffectPath(c, listener.path) && listener.event === 'child op') {
          var child_path = c.p.slice(listener.path.length);
          cb(child_path, c);
        }
      }
    }
  }