如何使用ng-click调用多个函数/链式调用

use*_*751 3 html javascript function angularjs angularjs-controller

嗨,我有一个按钮,可以触发两个功能.有没有办法让updateDetails只在changeColor完成后运行?updateDetails当前正在使用旧颜色而不是更改的颜色来提取旧配置.

ng-click="changeColor(color.code); updateDetails()"
Run Code Online (Sandbox Code Playgroud)

这是观点:

<div ng-controller="ColorsCtrl">
  <div ng-controller="HeaderCtrl">
    <div byo-header>
    </div>

    <div ng-repeat="color in colors" class="row">
      <div class="small-12 columns">
            <div ng-controller="ButtonsController">
                <div class="button-group">
              {{ isSelected(color.code) }}
                <button ng-click="changeColor(color.code); updateDetails()" type="radio" class="button" ng-model="selectedColor" btn-radio="color.code">{{color.name}}</button>
            </div>
            </div>  
      </div>
    </div>
    <br/>
    <br/>
    <div class="row">
        <div class="small-4 small-offset-4 columns">
        <!-- Proceed to packages if available -->
            <a ng-if="hasPackage" href="#/packages/{{modelCode}}" class="button">Packages</a>
        <!-- Proceed to options if packages not available -->
        <a ng-if="!hasPackage" href="#/options/{{modelCode}}" class="button">Options</a>
        </div>
    </div>    
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

这是ColorsCtrl中的changeColor():

$scope.changeColor = function(newColorCode){
        //swap previous selected color with new
        configuratorService.addOption($scope.modelCode, newColorCode, function(configuration){
            $scope.configuration = configuration;               
        });

    }

  }
Run Code Online (Sandbox Code Playgroud)

这是HeaderCtrl中的updateDetails

    $scope.updateDetails = function(){
        $scope.summaryDetails = getSummaryDetails();
    }
Run Code Online (Sandbox Code Playgroud)

tym*_*eJV 6

因为changeColor是异步操作 - 不,你不能等待内联.您必须在回调中调用该函数:

$scope.changeColor = function(newColorCode){
    //swap previous selected color with new
    configuratorService.addOption($scope.modelCode, newColorCode, function(configuration){
        $scope.configuration = configuration;  
        $scope.updateDetails();             
    });
}
Run Code Online (Sandbox Code Playgroud)

如果在其他地方使用此函数并且您并不总是想要调用update,则传递一个标志参数:

$scope.changeColor = function(newColorCode, shouldUpdate){
    //swap previous selected color with new
    configuratorService.addOption($scope.modelCode, newColorCode, function(configuration){
        $scope.configuration = configuration;  
        if (shouldUpdate) $scope.updateDetails();             
    });
}

ng-click="changeColor(color.code, true);"
Run Code Online (Sandbox Code Playgroud)