Javascript AngularJS ng repeat:将当前绑定元素传递给函数以进行条件呈现
我知道我们可以通过以下方式使用Javascript AngularJS ng repeat:将当前绑定元素传递给函数以进行条件呈现,javascript,angularjs,Javascript,Angularjs,我知道我们可以通过以下方式使用ng repeat实现条件绑定: <tr ng-repeat="viewer in allViewers track by viewer.Id"> <td> <img width="18" ng-src="{{!viewer.StatusByUser || viewer.StatusByUser != 1 ? '/images/icons/hide.
ng repeat
实现条件绑定:
<tr ng-repeat="viewer in allViewers track by viewer.Id">
<td>
<img width="18" ng-src="{{!viewer.StatusByUser || viewer.StatusByUser != 1 ?
'/images/icons/hide.svg' : '/images/icons/show-18x11.png'}}"
onerror="this.src='/images/icons/hide.svg'" alt="Viewer Status"
title="Click to {{!viewer.StatusByUser || viewer.StatusByUser != 1 ?
'publish' : 'unpublish'}}" ng-click="manageViewerStatus(viewer.StatusByUser)">
</td>
</tr>
因此,
viewer.Id
可以返回并在data bind
属性中呈现,但不会呈现src
属性。我听说过指令方法,但它似乎只能处理基础数据的索引,而不能处理元素本身。任何帮助都将不胜感激,谢谢。我建议使用这样的函数来获取正确的src
值,但不要将其写回-这实际上是一种不好的做法。相反,考虑一个列表或一个对象,其中键与迭代器有关,该值是图像的<代码> SRC < /代码>:
$scope.viewerimage={};
$scope.allViewers.forEach((v)=>{
$scope.viewerimage[v.Id]=getViewerImage(v);
});
函数getViewerImage(查看器){
//将来可以在这里编写更复杂的逻辑,以适应更多的状态。
return!viewer.StatusByUser | | viewer.StatusByUser!=1?'/images/icons/hide.svg':'/images/icons/show-18x11.png';
};
正如@Ruben helslot所建议的,这个问题本身可能不是一个好的做法。显然,并不是所有的技术问题都有自己直接的好答案,但所有的目标都可能有各种解决方案来实现相同的结果,其中可能包括最佳实践、适度解决方案,甚至只是一种变通方法。因此,解决方案寻求者也可以分享他们的目标,因为他们的问题本身可能不是推荐的好做法
现在我的答案是:为了同样的目标而使用
经过更广泛的研究,我发现ng switch
是我的完美解决方案:更干净、更少的代码、更具可扩展性和可读性、更具角度:
$scope.renderStatusImg = function (img, viewer) {
$(img).attr("src", !viewer.StatusByUser || viewer.StatusByUser != 1 ? '/images/icons/hide.svg' : '/images/icons/show-18x11.png');
// More complex logic can be written here in future to cater for more status.
return viewer.Id;
};
请注意
ng开关默认值
,这是促使我选择ng开关
的主要因素之一:它可以处理null
和未定义的
对象属性,非常适合为用户提供回退和升级服务。还要注意title
和alt
属性,我可以在ng开关的每个条件标记中正确定义它们,不需要复杂的代码和逻辑。注意,我甚至不需要编写任何额外的JavaScript来处理这个问题。感谢ng开关
,这意味着对于绑定的每次迭代,我需要再次迭代allViewers
来填充图像src?在将所有查看器
分配给$scope
之前,我是否可以先填充视图图像
?这样会更好吗?你说的“每次迭代”是什么意思?当数据发生变化时?因为这是真的,但在您的示例中也发生了,而且在ngif
中更常见。但是,如果数据只改变了一部分,您不必计算所有数据,这是一个好处。当然,您可以先填充viewerimage
,这没关系。AngularJS仅在代码空闲时触发$digest
循环,因此如果在同一个函数中分配它们,顺序不是问题。我的意思是,当每个
都被绑定时,您的代码是否会再次在整个AllViewer
数据源中循环?也就是说,如果我有20个查看器,它是否会循环20x,以确定每个img
的src
?我正在考虑使用Map
API来简化代码和逻辑,因为不仅src
,还需要根据StatusByUser
更改许多其他属性,例如title
和alt
。不,我是想在控制器中进行更改,获取数据或初始化控制器时。这意味着只做一次。
<img data-bind="{{renderStatusImg(this, viewer)}}" width="18" alt="Viewer Status"
title="Click to publish" ng-click="manageViewerStatus(viewer.StatusByUser)">
$scope.renderStatusImg = function (img, viewer) {
$(img).attr("src", !viewer.StatusByUser || viewer.StatusByUser != 1 ? '/images/icons/hide.svg' : '/images/icons/show-18x11.png');
// More complex logic can be written here in future to cater for more status.
return viewer.Id;
};
<tr ng-repeat="viewer in allViewers track by viewer.Id" ng-switch on="viewer.StatusByUser">
<td>
<img ng-switch-when="0" src="/images/icons/hide.svg" width="18" alt="Draft" title="Click to publish" ng-click="manageViewerStatus(viewer)">
<img ng-switch-when="1" src="/images/icons/show-18x11.png" width="18" alt="Published" title="Click to unpublish" ng-click="manageViewerStatus(viewer)">
<img ng-switch-default src="/images/icons/hide.svg" width="18" alt="Old version" title="Click to fix" ng-click="manageViewerStatus(viewer)">
</td>
<td>
<!-- More other columns that bound by viewer.StatusByUser can be benefited
from this approach. -->
</td>
</tr>