AngularJS ngclick切换函数调用

时间:2015-08-06 09:39:47

标签: javascript jquery angularjs

尝试使用启动和停止功能切换按钮。

继承人控制器

App.controller('LogPhoneMainController',
function LogPhoneMainController($scope) {

var self = this;

$scope.header = "Log a phone call";

$scope.stopwatches = [{ log: [] }, { interval: 1000, log: [] }, { interval: 2000, log: [] }];
});
App.filter('stopwatchTime', function () {
return function (input) {
    if(input){

        var elapsed = input.getTime();
        var hours = parseInt(elapsed / 3600000,10);
        elapsed %= 3600000;
        var mins = parseInt(elapsed / 60000,10);
        elapsed %= 60000;
        var secs = parseInt(elapsed / 1000,10);
        var ms = elapsed % 1000;

        return hours + ':' + mins + ':' + secs + ':' + ms;
    }
};
})
.directive('bbStopwatch', ['StopwatchFactory', function(StopwatchFactory){
return {
    restrict: 'EA',
    scope: true,
    link: function(scope, elem, attrs){   

        var stopwatchService = new StopwatchFactory(scope[attrs.options]);

        scope.startTimer = stopwatchService.startTimer; 
        scope.stopTimer = stopwatchService.stopTimer;
        scope.resetTimer = stopwatchService.resetTimer;

    }
};
}])
.factory('StopwatchFactory', ['$interval',    function($interval){

return function(options){

    var startTime = 0,
        currentTime = null,
        offset = 0,
        interval = null,
        self = this;

    if(!options.interval){
        options.interval = 100;
    }

    options.elapsedTime = new Date(0);

    self.running = false;

    function pushToLog(lap){
        if(options.log !== undefined){
            options.log.push(lap); 
        }
    }

    self.updateTime = function(){
        currentTime = new Date().getTime();
        var timeElapsed = offset + (currentTime - startTime);
        options.elapsedTime.setTime(timeElapsed);
    };

    self.startTimer = function(){
        if(self.running === false){
            startTime = new Date().getTime();
            interval = $interval(self.updateTime,options.interval);
            self.running = true;
        }
    };

    self.stopTimer = function(){
        if( self.running === false) {
            return;
        }
        self.updateTime();
        offset = offset + currentTime - startTime;
        pushToLog(currentTime - startTime);
        $interval.cancel(interval);  
        self.running = false;
    };

    self.resetTimer = function(){
        startTime = new Date().getTime();
        options.elapsedTime.setTime(0);
        timeElapsed = offset = 0;
    };

    self.cancelTimer = function(){
        $interval.cancel(interval);
    };

    return self;

};


}]);

继承人我的HTML。

<div class="container">
<div class="row">
    <div ng-controller="LogPhoneMainController" ng-init="init()">
        <h2>{{header}}</h2>
        <div ng-repeat="options in stopwatches|limitTo:1">
            <div bb-stopwatch options="options">
                <div class="container">
                    <div class="stopWatch numbers">
                        {{options.elapsedTime | stopwatchTime}}
                    </div>

                    <button class="btn" ng-click="startTimer()">start</button>
                    <button class="btn" ng-click="stopTimer()">stop</button>
                </div>
            </div>
        </div>
        <div ng-view>

        </div>
    </div>
</div>
</div>

我想要唯一一个btn,并且ngclick需要切换它调用的函数并显示iether相应的开始或停止。

更新:

我试过

$scope.startStop = "";

生活在控制器中,下面是在我的工厂

 self.startStopTimer = function (startStop) {
        if (startStop === "Start") {
            startTimer();
            $scope.startStop = "Stop";
        } else {
            stopTimer();
            $scope.startStop = "Start";
        }
    };

我把那些代码放在我的控制器中,而html按钮看起来像这样

<button class="btn" ng-click="startStopTimer()">
                        {{startStop}}
</button>

但我没有定义范围(编辑:由于函数所在的位置,我得到startStop未定义)

3 个答案:

答案 0 :(得分:0)

如果一切正常,你只想显示一个按钮,试试这个:

<button class="btn" ng-click="running?stopTimer():startTimer()">{{running?'stop':'start'}}</button>

答案 1 :(得分:0)

<button class="btn" ng-click="startTimer(toggleBtn)">{{btn.value}}</button>

并在函数调用内切换toggleBtn($ scope.toggleBtn =!$ scope.toggleBtn),如果参数为true startTimer()或false stopTimer()将被执行

或更简单的

你可以使用ng-show / ng-hide或ng-if用像

这样的变量来切换按钮
<button class="btn" ng-click="toggleBtn = !toggleBtn ; startTimer()" ng-if="toggleBtn">start</button>
<button class="btn" ng-click="toggleBtn = !toggleBtn ; stopTimer()" ng-if="!toggleBtn">stop</button>
当你想要开始按钮时, $ scope.toggleBtm应为true。

答案 2 :(得分:0)

在控制器中实现切换逻辑 用控制器设置按钮文本。

dependsOn
控制器中的

只实现一个函数<button class="btn" ng-click="startStopTimer()">{{startStop}}</button> 并基于startStopTimer的值切换按钮中的文本。