/**
 * @class CM_FormField_Text
 * @extends CM_FormField_Abstract
 */
var CM_FormField_Text = CM_FormField_Abstract.extend({
  _class: 'CM_FormField_Text',

  /** @type Boolean */
  _skipTriggerChange: false,

  events: {
    'blur input, textarea': function() {
      this.trigger('blur');
    },
    'focus input, textarea': function() {
      this.trigger('focus');
    }
  },

  /**
   * @param {String} value
   */
  setValue: function(value) {
    this._skipTriggerChange = true;
    this.$('input, textarea').val(value);
    this._skipTriggerChange = false;
  },

  /**
   * @return {Boolean}
   */
  hasFocus: function() {
    return this.getInput().is(':focus');
  },

  enableTriggerChange: function() {
    var self = this;
    var $input = this.getInput();
    var valueLast = $input.val();
    var callback = function() {
      var value = this.value;
      if (value != valueLast) {
        valueLast = value;
        if (!self._skipTriggerChange) {
          self.trigger('change');
        }
      }
    };
    // `propertychange` and `keyup` needed for IE9
    $input.on('input propertychange keyup', callback);
  }
});

@@ -362,22 +362,100 @@
 ocus');%0A
+    %7D,%0A    'change input, textarea': function() %7B%0A      this.triggerChange();%0A
     %7D%0A
-
   %7D,%0A%0A  
@@ -749,16 +749,135 @@
 ;%0A  %7D,%0A%0A
+  triggerChange: function() %7B%0A    if (this._skipTriggerChange) %7B%0A      return;%0A    %7D%0A    this.trigger('change');%0A  %7D,%0A%0A
   enable
@@ -881,32 +881,39 @@
 bleTriggerChange
+OnInput
 : function() %7B%0A 
@@ -1133,83 +1133,29 @@
     
-if (!self._skipTriggerChange) %7B%0A          self.trigger('change');%0A        %7D
+this.triggerChange();
 %0A   

Introduce triggerChange, use it on input/textarea change