AngularJS ngClass не применяется к новому ngView при пролистывании до нажатия кнопки

На этой неделе я реализовал смахивание в мобильном приложении и не нашел четкой демонстрации, показывающей смахивание в обоих направлениях. Поэтому я решил немного вернуть сообществу, я бы написал один. Так было до тех пор, пока я не заметил какое-то странное поведение, которое не мог понять.

Я поместил две кнопки в демо, чтобы протестировать демо. Чтобы провести пальцем, вы можете использовать мышь рядом с текстом. Что происходит, так это то, что когда я загружаю демо и прокручиваю уже существующий ngView, он получает класс из slideDir, а новый - нет. Это происходит из-за того, что новое представление имеет новую область видимости и не имеет представления о том, каким должен быть slideDir.

Случай второй: когда я нажимаю кнопку перед смахиванием, создается слайд-каталог и заполняется областью, которую используют кнопки, и поэтому смахивание начинает вести себя почти так, как должно (кроме некоторых проблем с синхронизацией между двумя областями).

Итак, что в моей конфигурации я делаю неправильно? У меня было предположение, что, поскольку контроллер приложения находился на более высоком уровне div, он не инициировался повторно каждый раз при загрузке нового ngView.

Следующий URL содержит демонстрацию: http://blackunknown.com/demos/swipingdemo/demo.html< /а>

Вот моя настройка в теге body:

<div ng-app="app" ng-controller="AppCtrl">
    <button ng-click='swipeLeft()'>Swipe Left</button>
    <button ng-click='swipeRight()'>Swipe Right</button>

    <div class="slide" ng-view ng-class="slideDir" ng-swipe-left="swipeLeft()" ng-swipe-right="swipeRight()">
    </div>

    <!-- Templates loaded on url change -->
    <script type="text/ng-template" id="pg1.html">
        <H3>Slide 1</H3>
    </script>
    <script type="text/ng-template" id="pg2.html">
        <H3>Slide 2</H3>
    </script>
    <script type="text/ng-template" id="pg3.html">
        <H3>Slide 3</H3>
    </script>
</div>

Вот мой javascript:

function AppCtrl($scope, $location, viewSlideIndex) {
    $scope.swipeLeft = function(){
        $scope.slideDir = 'slide-left';
    $scope.url = document.URL.substr(document.URL.lastIndexOf('/'));

        if($scope.url == "/pg1"){
            $scope.url = "/pg2";
        }
        else if ($scope.url == "/pg2"){
            $scope.url = "/pg3";
        }
        else if ($scope.url == "/pg3"){
            $scope.url = "/pg1";
        }

        $location.url($scope.url);
    }

    $scope.swipeRight = function(){
        $scope.slideDir = 'slide-right';
        $scope.url = document.URL.substr(document.URL.lastIndexOf('/'));

        if($scope.url == "/pg1"){
            $scope.url = "/pg3";
        }
        else if ($scope.url == "/pg2"){
            $scope.url = "/pg1";
        }
        else if ($scope.url == "/pg3"){
            $scope.url = "/pg2";
        }

        $location.url($scope.url);
    }
};

angular.module('app', ['ngRoute', 'ngAnimate', 'ngTouch'])
.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) {
    $routeProvider.when('/pg1', {
        templateUrl: 'pg1.html',
        controller: AppCtrl
    });
    $routeProvider.when('/pg2', {
        templateUrl: 'pg2.html',
        controller: AppCtrl
    });
    $routeProvider.when('/pg3', {
        templateUrl: 'pg3.html',
        controller: AppCtrl
    });
    $routeProvider.otherwise({
        redirectTo: '/pg1'
    });
    $locationProvider.html5Mode(true);
}])
.service('viewSlideIndex', function () {
    var viewIndex;
    return {
        getViewIndex: function () {
            return viewIndex;
        },
        setViewIndex: function (val) {
            viewIndex = val;
        }
    };
});

РЕДАКТИРОВАНИЕ: чтобы выполнить фактическое смахивание, не используйте кнопки, а щелкните и перетащите рядом с текстом.


person Blackunknown    schedule 09.04.2014    source источник
comment
Я сделал plunkr вашего кода, и, похоже, он работает в этой среде. Единственная разница, я думаю, в том, что у меня нет jQuery. plnkr.co/edit/10LKKuv1dL9N4yNn3tCw   -  person km6zla    schedule 10.04.2014
comment
Между кодом, который вы разместили здесь, и demo.js с вашего сайта есть что-то другое. Если я использую код здесь, он работает, если я вставлю demo.js, он сломается.   -  person km6zla    schedule 10.04.2014
comment
Разница в demo.js была вызвана тем, что я устранял проблему. Я пытался посмотреть, что произойдет, если я изначально установлю slideDir. Мои извинения.   -  person Blackunknown    schedule 10.04.2014
comment
Я проверил plunkr. Если вы проводите пальцем, не касаясь кнопок, слайд-каталог все равно не применяется к новому представлению. Хотя работает немного лучше. К сожалению, все та же проблема. Новый должен скользить со стилями ng-enter, но этого не происходит.   -  person Blackunknown    schedule 10.04.2014


Ответы (1)


На вашем сайте есть

$scope.slideDir = 'slide-right';

в верхней части AppCtrl.

Удалите это, и это сработает. Код, который вы вставили сюда, не имеет этой строки и работает так, как ожидалось.

person km6zla    schedule 09.04.2014
comment
+1 за замечание. Извините за путаницу, вызванную этой строкой кода, я пытался выяснить, приведет ли начальное значение к изменению. - person Blackunknown; 10.04.2014