У меня есть кнопка, в которой я хочу:
Вызовите несколько функций из контроллера, используя ng-click
(и я должен называть их в HTML)
Перейдите на другую страницу 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>
Создайте некоторые функции в контроллере и привяжите их к 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.
}
Похоже, после нажатия на эту ссылку вы хотите:
В вашем подходе отсутствует асинхронное управление. Страница перемещается непосредственно перед тем, как позволить вызовам 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 в этих маршрутах. В каждой из этих библиотек есть много учебников, которые позволят вам понять, как правильно писать маршруты приложений.
О мальчик, ты делаешь все это неправильно. Вам не нужно переходить на другую страницу из 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()
. Но так много чего не так, я просто потерял след. ;)