我有一个从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
}