1

我有一些 textAngular 代码,我在其中多次观察范围内的变量?有没有一种简单的方法可以只创建一次这个手表,或者我可以检测到它存在吗???

代码部分是:

 taRegisterTool('fontColor', {
    display: "<button colorpicker type='button' class='btn btn-default ng-scope'  title='Font Color'  colorpicker-close-on-select colorpicker-position='bottom' ng-model='fontColor' style='color: {{fontColor}}'><i class='fa fa-font '></i></button>",
    action: function (deferred) {
      var self = this;
      self.$watch('fontColor', function (newValue) {
        self.$editor().wrapSelection('foreColor', newValue);
      });
      self.$on('colorpicker-selected', function () {
        deferred.resolve();
      });
      self.$on('colorpicker-closed', function () {
        deferred.resolve();
      });
      return false;
    }
  });

每次单击此按钮时,都会执行此操作。这个 $watch 导致多个实例被创建并继续存在。

根据下面“npe”的有用评论,我修改了代码以防止手表被多次创建。

新代码:

taRegisterTool('fontColor', {
        display: "<button colorpicker type='button' class='btn btn-default ng-scope'  title='Font Color'  colorpicker-close-on-select colorpicker-position='bottom' ng-model='fontColor' style='color: {{fontColor}}'><i class='fa fa-font '></i></button>",
        action: function (deferred) {
          var self = this;
          if (typeof self.listener == 'undefined') {
            self.listener = self.$watch('fontColor', function (newValue) {
              console.log(newValue);
              self.$editor().wrapSelection('foreColor', newValue);
            });
          }
          self.$on('colorpicker-selected', function () {
            deferred.resolve();
          });
          self.$on('colorpicker-closed', function () {
            deferred.resolve();
          });
          return false;
        }
      });

感谢您的洞察力!

4

1 回答 1

0

根据评论和建议添加来自https://stackoverflow.com/users/1344008/npe的日志消息,很明显,在这种情况下,手表被创建了多次,我理解,并通过查看日志输出: 很明显,每个 watch 都被添加了,即使监视完全相同的变量,也需要跟踪添加时返回的侦听器,以便删除它。这完全有道理......我只是没有想得那么清楚:-) 所以我修改了代码以消除这种低效率。感谢那些看过这个的人。

于 2015-05-04T20:01:40.707 回答