在特定元素的循环中控制 ng-show 的状态

control state of ng-show in a loop of a particular element

我正在我的表单中动态生成一个操作列表。例如,保存、批准、拒绝。当您单击这些操作之一时,我希望微调器出现在该按钮内,直到我从服务器获得成功响应。

我有以下代码。

按钮

<button type="submit" value="{{e.label}}" ng-click="getCtrlScope().formData.requestAction=e.action;" class="btn {{e.btnStyle}}"  ng-repeat="e in buttonActions">
    <span ng-show="saveState == 'save'"> {{e.label}} </span> 
    <span ng-show="saveState == 'loading'"> {{e.label}} 
        <i class="fa fa-spinner fa-spin"></i>
    </span> 
    <span ng-show="saveState == 'completed'"> {{e.label}} 
        <i class="fa fa-check"></i>
    </span>
</button>

js

$scope.saveState = 'save' ;

$scope.save = function() {      
    $scope.saveState = 'loading'

    $http.post('../reviewRequest.json', $scope.formData).then(
        function(response) {    
            $scope.saveState = 'save'
        }, function(response) {
    });
};  

正如您可能看到的那样,当您单击某个操作时,我所有的按钮都会开始旋转。如何将旋转限制为单个按钮?

这不是一个好的做法,正如@fantarama 所提到的,您应该在元素内部使用 属性,而不是 $scope。

无论如何,如果您不介意,可以将您点击的元素存储在 ng-click call

ng-click="getCtrlScope(e)..."

将该元素存储在某个变量中:

function getCtrlScope(element) {
    $scope.clickedElement = element;
    ...
}

然后,在你的 HTML:

<span ng-show="saveState == 'save' && e !== clickedElement"> {{e.label}} </span> 
<span ng-show="saveState == 'loading' && e === clickedElement"> {{e.label}} 
    <i class="fa fa-spinner fa-spin"></i>
</span>
<span ng-show="saveState == 'completed' && e === clickedElement"> {{e.label}}
    <i class="fa fa-check"></i>
</span>

编辑

假设您的 POST 调用位于 getCtrlScope 中,您可以执行如下操作:

  • 如前所述,在将传递给保存函数的函数调用中添加元素
  • 将状态存储在元素本身中(不要忘记对其进行初始化)
  • 更新 ng-show 条件

HTML:

<button type="submit" value="{{e.label}}" ng-click="getCtrlScope(e).formData.requestAction=e.action;" class="btn {{e.btnStyle}}" ng-repeat="e in buttonActions">
    <span ng-show="e.saveState == 'save'"> {{e.label}} </span> 
    <span ng-show="e.saveState == 'loading'"> {{e.label}} 
        <i class="fa fa-spinner fa-spin"></i>
    </span>
    <span ng-show="e.saveState == 'completed'"> {{e.label}}
        <i class="fa fa-check"></i>
    </span>
</button>

JS:

$scope.save = function(element) {      
    element.saveState = 'loading'

    $http.post('../reviewRequest.json', $scope.formData).then(
        function(response) {    
            element.saveState = 'save'
        }, function(response) {
    });
};

根据你的Plunker,我稍微修改了一下。如您所见,当您单击它们时,每个按钮的状态都会以独立的方式发生变化。

查看结果here