Перейдите на страницу HTML с помощью ng-click

0

У меня есть кнопка, в которой я хочу:

  1. Вызовите несколько функций из контроллера, используя ng-click (и я должен называть их в HTML)

  2. Перейдите на другую страницу html, помещенную в " static/page.html "

onclick, когда используется для навигации (location.href), переопределяет ng-click ! Даже при связывании всех функций.

Вот тег кнопки:

<div ng-repeat="object in nc.objects">
 <button ng-click="fun1(object.id); fun2(object.name);">
 button
 </button>

кнопка

$scope.fun1 = function (id) {

        var url = "/req/"+id;
        var Request = $http.get(url);
        Request.then(function (response) {
            $localStorage.var1  = response.data;

        });

    }

    $scope.fun2 = function (name) {

        var url = "/otherReq/"+name;
        var Request = $http.get(url);
        Request.then(function (response) {
            $localStorage.var2  = response.data;

        });

    }

ngRoute

myApp.config(['$routeProvider',
    function($routeProvider) {
        $routeProvider.

        when('/page2', {
            templateUrl: 'page2.html' <!-- also tried static/page2.html  but not working -->
        });

    }]);

в HTML

<button ng-click = "navigate(object.id, object.name, '/page2' )" > </button>

Изображение 174551

  • 0
    Почему бы не определить функцию, которая делает все это, и вызвать ее с помощью ng-click?
  • 0
    @Ryan.HuntRyan.Hunt Как я могу перейти на HTML-страницу с функцией angularJS?
Показать ещё 1 комментарий
Теги:

3 ответа

1

Создайте некоторые функции в контроллере и привяжите их к ng-клику. Вот так:

<button ng-click="clicked(object.id, 'page.html')>

и в вашем контроллере:

$scope.clicked = function(id, name, url){
    $scope.fun1(id);
    $scope.fun2(name); //or whatever you need to do..
    window.location = url; //this will change your browser location to the one specified.
}
  • 0
    Спасибо за уделенное время. Проблема заключается в том, что функции извлекают некоторые строки из БД, и ваше решение перемещается без извлечения строк, где строки необходимы на следующей странице.
  • 0
    Если вам нужно получить данные и сделать их доступными на следующей странице, вам нужно использовать ng-route или ui-router, чтобы упростить их. Если вы не хотите их использовать, вам все равно придется создать сервис / фабрику для выполнения ваших вызовов, сохранять данные и вставлять их в контроллер следующей страницы.
Показать ещё 3 комментария
0

Похоже, после нажатия на эту ссылку вы хотите:

  • сделать апи-звонок
  • хранить данные в localstorage
  • перейти к следующей странице

В вашем подходе отсутствует асинхронное управление. Страница перемещается непосредственно перед тем, как позволить вызовам api возвращать любые данные, которые всегда занимают короткий промежуток времени.

Решение Luxor001 является хорошим первым шагом, но, вероятно, нужно дождаться, когда fun1 и/или fun2 будут выполнены перед навигацией. Посмотрите, как работают обещания.

Я думаю, что SLearner наиболее близок к решению, но не разрешает асинхронные вызовы api в его маршрутизации.

Чтобы использовать асинхронный характер ваших вызовов HTTP, вам нужно вернуть их из своих функций.

Что-то вроде этого будет работать:

$scope.fun1 = function (id) {
    var url = "/req/"+id;
    var Request = $http.get(url);
    return Request.then(function (response) {
        $localStorage.var1  = response.data;
    });
}

$scope.fun2 = function (name) {
    var url = "/otherReq/"+name;
    var Request = $http.get(url);
    return Request.then(function (response) {
        $localStorage.var2  = response.data;
    });
}

$scope.objectClicked = function (id, name, someAngularRoute) {
  $scope.func1(id)
  .then(function(func1result) {
      return $scope.func2(name);
  })
  .then(function(func2result) {
       $location.path(someAngularRoute);
  });
}

Сказав это, Слейнер прав: вы делаете все неправильно здесь :)

Вы должны сформулировать свою маршрутизацию приложения вокруг ng-маршрута ui-router и разрешить вызовы api в этих маршрутах. В каждой из этих библиотек есть много учебников, которые позволят вам понять, как правильно писать маршруты приложений.

0

О мальчик, ты делаешь все это неправильно. Вам не нужно переходить на другую страницу из HTML. И вы определенно не должны использовать onclick при работе с Angular. Это не совсем так.

То, как вы хотите это сделать:

<button ng-click="objectClicked(object.id, object.name, someAngularRoute)>

Теперь, прежде чем двигаться дальше, вам нужно понять, что такое angularRoute. По маршруту я имею в виду представление, связанное с someAngularRoute. Здесь someAngularRoute - это в основном ваш базовый url + someAngularRoute

Итак, когда вы говорите, что вы хотите открыть page1.html на кнопку мыши, то вы, вероятно, означает, что вы хотите, чтобы открыть маршрут page1 которого templateUrl (или VIEW) является page1.html.

myApp.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
      // will open the the window url is www.example.com/page1
      when('/page1', {
        templateUrl: 'static/page1.html' 
      }).
      // will open the the window url is www.example.com/page2
      when('/page2', {
        templateUrl: 'static/page2.html'  
      }).
      otherwise({
        redirectTo: '/404'
      });
  }]);

А затем в контроллере:

$scope.objectClicked = function (id, name, someAngularRoute) {
      func1(id);
      func2(name);
      $location.path(someAngularRoute);
    }

Убедитесь, что в ваш контроллер введено значение $.

ОБНОВИТЬ

@vgrafe прав. Я не видел ваш обновленный вопрос с fun1(). Но так много чего не так, я просто потерял след. ;)

  • 0
    Спасибо, $ location.path (страница); не работает хорошо! URL стал: localhost: 8080 / html / page1.html # / page2.html .
  • 0
    Я обновил свой ответ.
Показать ещё 2 комментария

Ещё вопросы

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