ng-show 指令不起作用 Angular(controllerAs 问题)

ng-show directive not working Angular (controllerAs issue)

我正在构建一个带有计时器和 2 个按钮的单页应用程序:

这是 HTML :

  <h1>{{ home.time | formattime }}</h1>
  <button type="button" class="btn btn-primary" ng-hide="onBreak"
          ng-click="home.workTimer()" ng-bind="home.startOrResetWork">
  </button>
  <button type="button" class="btn btn-primary" ng-show="onBreak"
          ng-click="home.breakTimer()" ng-bind="home.startOrResetBreak">
  </button>

控制器:

(function() {
  function HomeCtrl($interval) {
    var $ctrl = this;

    var promise;

    $ctrl.time = 1500;
    $ctrl.startOrResetWork = "START WORK";
    $ctrl.startOrResetBreak = "START BREAK";

    $ctrl.onBreak = false;

    $ctrl.stopTimer = function() {
      $interval.cancel(promise);
    };

    $ctrl.startTimer = function() {
      promise = $interval(function() {$ctrl.time--;}, 1000, [$ctrl.time]);
    };

    $ctrl.workTimer = function() {
      ($ctrl.startOrResetWork === "START WORK") ? $ctrl.startOrResetWork = "RESET" : $ctrl.startOrResetWork = "START WORK";
      if ($ctrl.startOrResetWork === "START WORK") {
        $ctrl.stopTimer();
        $ctrl.time = 1500;
      } else if ($ctrl.startOrResetWork === "RESET") {
        $ctrl.startTimer();
        promise.then(function() {
                      $scope.onBreak = true;
                    });
      }
    };

    $ctrl.breakTimer = function() {};

  }

  angular
    .module('pomodoroManager')
    .controller('HomeCtrl', ['$interval', HomeCtrl]);
})();

和app.js

(function() {

  function config($locationProvider, $stateProvider) {
    $locationProvider
      .html5Mode({
        enabled: true,
        requireBase: false
      });

    $stateProvider
      .state('home', {
        url: '/',
        controller: 'HomeCtrl as home',
        templateUrl: '/templates/home.html'
    });
  }

  angular
    .module('pomodoroManager', ['ui.router', 'ui.bootstrap', 'firebase'])
    .config(config);
})();

基本上,一旦第一个倒计时结束 (promise.then(...)),我将 onBreak 设置为 true,这应该使用 ng-show 指令显示第二个按钮。

问题是什么? 它不是。使用 ng-inspector,我看到 onBreak 确实等于 true,但我一直看到第一个按钮而不是第二个按钮。

其他问题: 假设我创建了一个函数:

$ctrl.toggleOnBreak = function() {
  $ctrl.onBreak = true;
};

然后做:

promise.then($ctrl.toggleOnBreak());

我仍然没有得到正确的按钮行为,更糟糕的是,onBreak 在单击时设置为 true,而不是在计时器结束时...

请帮忙...我坚持了太久

您似乎在控制器中使用了 controllerAs 语法,但在 HTML` 中没有使用。在您的 html 中需要引用 属性 才能访问这些值。

ng-controller="HomeCtrl as $ctrl"

现在像这样访问变量。

ng-hide="$ctrl.onBreak"