нг-если не ловит обновленные значения $ scope

0

Я был далеко от angular 1.x так долго, я, кажется, забыл что-то важное о ng-if. У меня есть функция, которая обновляет значение области, когда карусель меняет изображения, которые отслеживают активный индекс массива карусели. У меня есть ng-if чтобы удалить один элемент и вставить другой, когда индекс достигнет конца массива, примерно так:

  <span ng-if="activeIndex < 4"
        class="back-button"
        ui-sref="app.profile.index({uID: user.uID})">
    Skip <i class="ion-chevron-right"></i>
  </span>

  <span ng-if="activeIndex === 4"
        class="skip-button"
        ui-sref="app.profile.index({uID: user.uID})">
    Continue <i class="ion-chevron-right"></i>
  </span>

но он не работает. Я полагаю, что ng-if создает новую область видимости, поэтому может быть и не улавливать обновленные значения, но если это так, то какой простой способ обновить область ng-if? Или я полностью обернулся?

Вот codepen показывающий мою проблему: http://codepen.io/datatype_void/pen/zqjGOr?editors=1001

  • 0
    Почему вы храните $scope.activeIndex = '0'; как строка вместо int ?
  • 0
    Вы правы, это создает новую сферу. Вместо этого вы можете попробовать ngHide и ngShow.
Показать ещё 2 комментария
Теги:

2 ответа

1
Лучший ответ

Я добавил $scope.$apply(); после изменения activeIndex, и это решило проблему.

function(swiper){
  $scope.activeIndex = swiper.activeIndex;
  $scope.$apply();

хотя я не уверен, почему он не применяется автоматически.

Рабочий код: http://codepen.io/C14L/pen/bpKrLo?editors=1111

(также изменил максимальное значение на 2, потому что раньше он не доходил до 4, но это не проблема).

1

JavaScript:

angular.module('ionicApp', ['ionic'])

.controller('MainCtrl', function($scope, $timeout) {
  $scope.updateIndex = function(index) {
    $timeout(function() {
         $scope.activeIndex = index;
    });
  };

  $scope.options = {
    autoplay: 300,
    speed: 500,
    effect: 'cube',
    onSlideChangeStart : function(swiper){
      if (swiper.activeIndex !== 'undefined') {
        $scope.updateIndex(swiper.activeIndex);
      }
    }
  }

  $scope.updateIndex(0);
});

HTML:

<span ng-if="activeIndex < 2"
      ui-sref="app.profile.index({uID: user.uID})">

  Skip <i class="ion-chevron-right"></i>
</span>

<span ng-if="activeIndex == 2"
      ui-sref="app.profile.index({uID: user.uID})">

  Continue <i class="ion-chevron-right"></i>
</span>

AngularJS предоставляет $ timeout, что походит на setTimeout, но автоматически поменяет ваш код в $ apply по умолчанию.

Для получения дополнительной информации: http://www.codingeek.com/angularjs/angular-js-apply-timeout-digest-evalasync/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню