hasChanges() {
    this.recomputeDiff();
    return this.current.text !== this.proposed.text ||
      this.current.selectedRange.start !== this.proposed.selectedRange.start ||
      this.current.selectedRange.length !== this.proposed.selectedRange.length;
  }
Determines whether this field has changes.

@returns {boolean} true if either the current text doesn't match the proposed text
   or the current selection range doesn't match the proposed selection range