Как я могу направить запрос URL для получения данных, а также запустить функцию для изменения CSS в angularjs?

У меня есть ссылка, которая используется для загрузки данных, а затем я хочу изменить стиль CSS. Я хочу, чтобы и данные загружались, и изменение CSS происходило из одного события щелчка.

<section ng-controller="OffrdHeadCntrl">
<section id="menuOff" ng-class="{true: 'OpenMenu', false: 'ZeroWide'}[MenuStatus]">
    <b>Menu</b><br>
    <nav>
       <ul id='OffrdCat'>
          <li><a href="#Antiques">Antiques</a></li>
          <li><a href="#Appliances">Appliances</a></li>
       </ul>
    </nav>
</section>
     .... More HTML in another section here.
</section>

Это провайдер маршрута:

var ysshApp = angular.module('ysshApp', [
  'ngRoute',
  'ysshControllers',
  'firebase'
]);
  // 'ysshServices'

ysshApp.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
      when('/Antiques', {
        templateUrl: 'Client_Pages/Offered_Menu.html',
        controller: 'CommonController',
        customInput: 'zeg0yv7nxle6a5sr2xl-ezs'
      }).
      when('/Appliances', {
        templateUrl: 'Client_Pages/Offered_Menu.html',
        controller: 'CommonController',
        customInput: 'zh86tu488b8g6maw9wrfk'
      })
      .otherwise({ redirectTo:'/Tab_Home_1' });

  }]);

Когда пользователь нажимает «Антиквариат», загружается куча данных. Ссылка вызывает изменение URL-адреса, что приводит к тому, что $routeProvider использует контроллер, который затем загружает данные. У меня также есть функция, которая изменяет стиль CSS:

Это контроллер, который загружает данные:

var ysshControllers = angular.module('ysshControllers', []);

ysshControllers.controller('CommonController',
    function($scope, $http, $route) {
        $scope.dbKey = $route.current.customInput;
        $scope.urlToDb = 'https://' + $scope.dbKey + '.firebaseio.com/.json';
        $http.get($scope.urlToDb).success(function(data) {
            var values = [];
            for (var name in data) {
            values.push(data[name]);
            }
            $scope.UsedItems = values;
            });
            // Initially order by date and time
            $scope.orderProp = 'Time';
            }     
        );

Есть функция/контроллер? который изменяет CSS: (я удалил кое-что)

 function OffrdHeadCntrl($scope) {
    $scope.OpenCloseMenu = function() {
            if ($scope.MenuStatus === true) {
                $scope.OutputStatus = 'MuchWide';}
            else
                {$scope.OutputStatus = 'FullWideVal';}
 };
}

Я могу изменить либо CSS, либо данные для загрузки, но не то и другое одновременно. Я пытался поместить ng-click="OpenCloseMenu()" во всевозможные места, но либо routeProvider будет работать, либо изменение CSS, но не то и другое одновременно.

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

Я пытаюсь изменить CSS, чтобы скрыть часть меню на странице до загрузки данных. Я могу использовать свойство объекта Resolve, чтобы сначала что-то разрешить, прежде чем данные будут загружены. Это сработает, но у меня возникли проблемы с настройкой контроллера, чтобы он был доступен. Я могу заставить Resolve работать, но не могу запустить функцию. Если я добавлю это в routeProvider, появится предупреждающее сообщение, а затем, как только я нажму OK, данные загрузятся.

            resolve: {
                // Run code in resolve first
                whatever: function() {
                alert("it ran");
                }
            }

Это будет работать для меня, если я смогу получить функцию, которую мне нужно запустить, но я еще не понял этого.

Я успешно запустил $routeChangeSuccess, но он запускается ДО загрузки данных.

ysshControllers.controller('OffrdCatChg', function($scope) {
    $scope.$on('$routeChangeSuccess', function(){
        alert("it ran the success?");
    });
});

Так что не думаю, что мне это поможет. Я создал новый контроллер и поместил имя контроллера в тег HTML на этой странице. Он запускается при изменении маршрута, но запускается до загрузки данных. Это было бы нормально, но некоторые из моих других кодов запускаются после этого и возвращают CSS к оригиналу. Должен быть способ проверить запуск конкретного контроллера.


person Alan Wells    schedule 28.01.2014    source источник


Ответы (2)


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

Что касается изменения CSS, это отражение состояния, тесно связанное с изменением URL-адреса (если я правильно понимаю ваше описание), поэтому вы должны прослушивать событие изменения URL-адреса в чем-то вроде rootController (помимо ng-view), например :

    $scope.$on '$routeChangeSuccess', (e, current, previous) ->
        //getting url segments, and updates css as it should be
    return

Логика для меня такова:

click the link ---> router change ---> new controller(data load)
                    |
                    |
                    |--------->routeChangeSuccess event ---> update the css
person sunderls    schedule 28.01.2014
comment
Спасибо. Этот поток программы кажется, что он будет работать. Я изучу событие $routeChangeSuccess. - person Alan Wells; 28.01.2014

Я смог найти решение. Прежде всего, я думаю, что мой контроллер был определен неправильно. У меня была определена функция, и она работала, но я не думаю, что она была настроена правильно. У меня была написана такая функция:

function CntrlMyCSS($scope) {
    $scope.OpenCloseMenu = function() {
            if ($scope.MenuStatus === true) {
                $scope.OutputStatus = 'MuchWide';}
            else
                {$scope.OutputStatus = 'FullWideVal';}
 };
}

У меня он не был привязан к модулю или определен как контроллер. Это новое изменение.

ysshControllers.controller('HideShowInOffered',

ysshControllers.controller('HideShowInOffered',
 function CntrlMyCSS($scope) {
    $scope.OpenCloseMenu = function() {
            if ($scope.MenuStatus === true) {
                $scope.OutputStatus = 'MuchWide';}
            else
                {$scope.OutputStatus = 'FullWideVal';}
 };
}
);

Итак, я думаю, что, хотя я добавил

ng-controller="CntrlMyCSS"

в тег HTML, и это сработало, на самом деле это был не контроллер? я не знаю. Я использовал имя функции в качестве контроллера. Я знаю, что определение его как контроллера, казалось, сделало содержимое этого контроллера доступным для другого моего контроллера. Я до сих пор не совсем понимаю, но в основном я просто добавил строку вверху функции, чтобы привязать ее к модулю, и определить ее как контроллер, и изменить тег HTML на имя контроллера вместо имени функции.

Другая вещь, которая помогла, — это возможность отлаживать код, устанавливая точки останова, проходя строки и просматривая присвоенные значения. Если бы не это, я, вероятно, до сих пор шел бы по дороге в никуда.

Исправление в основном заключалось в настройке того, что я настроил. Я попробовал $routeChangeSuccess, но, пройдясь по коду, увидел, что он срабатывает до загрузки данных. Это не сработало для меня, потому что контроллер устанавливал значения CSS по умолчанию для начальной загрузки страницы. Таким образом, он изменит CSS, а затем вернет его к исходному. Что происходит так быстро, без отладчика я бы и не узнал.

$scope.$on('$routeChangeSuccess', function(){
    alert("it ran the success?");
});

Попытка получить исправление через routeProvider, похоже, тоже бесполезна. По сути, это была проблема доступности кода для вызова и изучения времени выполнения программы посредством отладки.

Урок истории? Потратьте время, чтобы убедиться, что у вас есть способ пошагово пройтись по коду и определить, каков поток программы. Вероятно, существует бесконечное количество неправильных догадок и, возможно, только одно решение. Шансы против вас, если вы не можете отлаживать.

Это контроллер, который загружает данные, затем форматирует данные, затем изменяет CSS, чтобы закрыть меню.

ysshControllers.controller('CommonController',
    function($scope, $http, $route) {
        $scope.dbKey = $route.current.customInput;
        $scope.urlToDb = 'https://' + $scope.dbKey + '.firebaseio.com/.json';
        $http.get($scope.urlToDb).success(function(data) {
            var values = [];
            for (var name in data) {
            values.push(data[name]);
            }
            $scope.UsedItems = values;
            });
            // Initially order by date and time
            $scope.orderProp = 'Time';
            $scope.MenuStatus = false;
            $scope.OutputStatus = 'FullWideVal';
            }
);
person Alan Wells    schedule 29.01.2014