在模板内的条件运算符和函数调用之间进行选择
chosse between conditional operator and function call inside template
我的问题是关于在这两种方法中选择哪种更好更快。
我有以下模板,它根据条件应用三个 类 中的任何一个。
方法一:
我在模板中使用了三元运算符
data-ng-class="(data.selectionStatus[id] === 'RED') ? 'red-class' : (data.selectionStatus[id] === 'BLUE') ? 'blue-class' : 'no-color-class'"
方法二:
不要在模板中使用条件,而是使用一个函数来 return 正确的值。
Template:
data-ng-class="getSelectionStatus(id)"
JavaScript:
$scope.getSelectionStatus = function (id) {
/*get status using id*/
var selectionStatus = $rootScope.data.selectionStatus[id];
if (selectionStatus === 'RED') {
return 'red-class';
} else if (selectionStatus === 'BLUE') {
return 'blue-class'';
} else {
return 'no-color-class';
}
};
P.S。我使用 AngularJS v1.3.10.
如果您还没有读过 John Papa 的 Angular 风格指南 (https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md),我强烈推荐它。它没有针对您情况的特定规则,但其中解释的原则和规则将帮助您为您的项目做出最佳决定。
就速度而言,从技术上讲,一种方法 IS 比另一种更快。但是,它可能因浏览器而异:
javascript if/else or ternary operator is faster?
因此,除非您在 javascript 中处理实时音频,否则可读性远远超过这两种方法的微不足道的性能差异。在我看来,方法 2 比第一种方法更具可读性。这并不是说某些情况会迫使您使用方法 #1。
如果您将模板预编译为 javascript,您可以像这样将逻辑放在新行中:
<div data-ng-class="(data.selectionStatus[id] === 'RED') ?
'red-class' :
(data.selectionStatus[id] === 'BLUE') ?
'blue-class' :
'no-color-class'">
但不推荐。即使在不同的行上,它的可读性也不是很好。正如 charlietfl 提到的,使用对象语法也略微提高了可读性。如果你把它放在多行上更是如此:
<div data-ng-class="{
'red-class': data.selectionStatus[id] === 'RED',
'blue-class': data.selectionStatus[id] === 'BLUE',
'no-color-class': !data.selectionStatus[id]
}">
如果你真的想变得疯狂,你可以使用 switch 语句。没有性能差异,但它比任何一种解决方案都更具可读性:
$scope.getSelectionStatus = function (id) {
/*get status using id*/
var selectionStatus = $rootScope.data.selectionStatus[id];
switch (selectionStatus) {
case 'RED':
return 'red-class';
break;
case: 'BLUE':
return 'blue-class';
break;
default:
return 'no-color-class';
}
};
我的问题是关于在这两种方法中选择哪种更好更快。
我有以下模板,它根据条件应用三个 类 中的任何一个。
方法一:
我在模板中使用了三元运算符
data-ng-class="(data.selectionStatus[id] === 'RED') ? 'red-class' : (data.selectionStatus[id] === 'BLUE') ? 'blue-class' : 'no-color-class'"
方法二:
不要在模板中使用条件,而是使用一个函数来 return 正确的值。
Template:
data-ng-class="getSelectionStatus(id)"
JavaScript:
$scope.getSelectionStatus = function (id) {
/*get status using id*/
var selectionStatus = $rootScope.data.selectionStatus[id];
if (selectionStatus === 'RED') {
return 'red-class';
} else if (selectionStatus === 'BLUE') {
return 'blue-class'';
} else {
return 'no-color-class';
}
};
P.S。我使用 AngularJS v1.3.10.
如果您还没有读过 John Papa 的 Angular 风格指南 (https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md),我强烈推荐它。它没有针对您情况的特定规则,但其中解释的原则和规则将帮助您为您的项目做出最佳决定。
就速度而言,从技术上讲,一种方法 IS 比另一种更快。但是,它可能因浏览器而异: javascript if/else or ternary operator is faster?
因此,除非您在 javascript 中处理实时音频,否则可读性远远超过这两种方法的微不足道的性能差异。在我看来,方法 2 比第一种方法更具可读性。这并不是说某些情况会迫使您使用方法 #1。
如果您将模板预编译为 javascript,您可以像这样将逻辑放在新行中:
<div data-ng-class="(data.selectionStatus[id] === 'RED') ?
'red-class' :
(data.selectionStatus[id] === 'BLUE') ?
'blue-class' :
'no-color-class'">
但不推荐。即使在不同的行上,它的可读性也不是很好。正如 charlietfl 提到的,使用对象语法也略微提高了可读性。如果你把它放在多行上更是如此:
<div data-ng-class="{
'red-class': data.selectionStatus[id] === 'RED',
'blue-class': data.selectionStatus[id] === 'BLUE',
'no-color-class': !data.selectionStatus[id]
}">
如果你真的想变得疯狂,你可以使用 switch 语句。没有性能差异,但它比任何一种解决方案都更具可读性:
$scope.getSelectionStatus = function (id) {
/*get status using id*/
var selectionStatus = $rootScope.data.selectionStatus[id];
switch (selectionStatus) {
case 'RED':
return 'red-class';
break;
case: 'BLUE':
return 'blue-class';
break;
default:
return 'no-color-class';
}
};