$ setViewValue具有对象复制性能

时间:2014-09-06 18:30:17

标签: angularjs

我有一个从Angular UI的btnRadio派生的切换按钮的指令。我没有使用带有切换值的简单模型,而是将其修改为接受一个模型,该模型是所有指令实例使用的“全局”对象 - 我将密钥传递给指令以提取特定数据。在我的指令中,我搜索这个对象并从那里处理它。一切都很好,但我有一个性能问题。在指令中,我必须制作模型的副本(根据Angular文档)并使用ngModelController将其重新应用到我的视图。$ setViewValue。此模型可包含100个条目。而这个指令可能会出现几十次。如果我在每个指令中创建这个大对象的副本,是否有可能发生内存泄漏?

这是指令:

app.directive('btnChoice', function () {
  return {
    require: ['btnChoice', 'ngModel'],
    controller: 'ButtonsController',
    link: function (scope, element, attrs, ctrls) {
      var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];

      function getChoice() {
        var val = scope.$eval(attrs.btnValue);
        console.log(val);
        return (angular.isDefined(val) && ngModelCtrl.$modelValue && ngModelCtrl.$modelValue[val]) ? ngModelCtrl.$modelValue[val] : false;
      }

      //model -> UI
      ngModelCtrl.$render = function () {
        element.toggleClass(buttonsCtrl.activeClass, angular.equals(getChoice(), attrs.btnChoice));
      };

      //ui->model
      element.bind(buttonsCtrl.toggleEvent, function () {
        if (!element.hasClass(buttonsCtrl.activeClass)) {
          scope.$apply(function () {
            var ev = attrs.btnEvent;
            var c = attrs.btnChoice;
            var v = scope.$eval(attrs.btnValue);
            scope.$emit(ev, { model: v, value: c });
            ngModelCtrl.$modelValue[v] = c;
            // The line below worries me
            ngModelCtrl.$setViewValue(angular.copy(ngModelCtrl.$modelValue););
            ngModelCtrl.$render();
          });
        }
      });
    }
  };
});

以下是观点:

 <div class="btn-group">
  <label class="btn btn-primary" ng-model="$attendances" btn-event="attend" btn-choice="yes" btn-value="item.id">Yup</label>
  <label class="btn btn-primary" ng-model="$attendances" btn-event="attend" btn-choice="maybe" btn-value="item.id">Maybe</label>
  <label class="btn btn-primary" ng-model="$attendances" btn-event="attend" btn-choice="no" btn-value="item.id">Nope</label>
</div>

模型如下:

var model = {
  '7612tas337213': 'yes',
  '7q23423h1237s': 'maybe
}

0 个答案:

没有答案