Angular. Как передать параметр в функцию из шаблона и вызвать get?

Всем привет.
Что делаю не так?

.controller('ProfileDetail', function($scope, $http) {
    $scope.myFunc = function (id) {
        // получаем json
        $scope.url = 'profile/?=' + id;
        $http.get($scope.url).success(function (data) {
            return data;
        }).error(function (data, status) {
            $scope.response = 'Request failed';
        });
    };
});

И в шаблоне пробую получить
<div ng-controller="ProfileDetail">
    <div>
        {{ myFunc(4) }}
    /div>
</div>
  • Вопрос задан
  • 6467 просмотров
Решения вопроса 1
mannaro
@mannaro Куратор тега JavaScript
Умею профессионально гуглить
Все так. Функция выполнится. Правда ничего не выведет, но выполнится.

Попробуйте codeo.me/5yQ
И в HTML: codeo.me/5yR
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Ну так верните из вашей функции промис, который возвращает $http. Вообще так лучше не делать, а лучше явно объяслять данные и выносить запросы в сервисы, но в целях обучения можно на это закрыть глаза.

Если я правильно понимаю изначальную задачу, то лучше сделать так:
angular.module('app')
    .controller('ProfileDetail', $scope, $http) {
        $scope.$watch('selectedId', function (id) {
            if (!id) {
                  $scope.data = {};
                  return;
            }
            var url = 'profile/?=' + id;
            $http.get(url).then(function (response) {
                $scope.data = response.data;
            }, function () {
                // обрабатывайте ошибки
            })
        });
    })

<div ng-controller="ProfileDetail">
    <div>
        {{ data }}
    /div>
<span class="btn" ng-click="selectedId = 4"></span>
</div>


Если же у вас данные просто должны быть инициализированы сразу по инициализации контроллера - ну так вызовите все прямо там. Не стоит вообще управлять загрузкой и вызывать методы какие-либо из шаблонов. Все зависит от задачи конечно, но мне сложно придумать кейс когда это нужно делать.
Ответ написан
Комментировать
madmages
@madmages
Человек прямоходящий
.controller('ProfileDetail', function($scope, $http) {
        var url = 'profile/?=4';
        $http.get(url).success(function (data) {
            $scope.data = data;
        }).error(function (data, status) {
            $scope.response = 'Request failed';
        });
    
});


<div ng-controller="ProfileDetail">
    <div>
        {{ data }}
    /div>
</div>


а если нужна реакция на клик то

.controller('ProfileDetail', function($scope, $http) {
    $scope.data = '';
    $scope.doThisShit = function(id){
        var url = 'profile/?=' + id;
        $http.get(url).success(function (data) {
            $scope.data = data;
        }).error(function (data, status) {
            $scope.response = 'Request failed';
        });
    }
});


<div ng-controller="ProfileDetail">
    <div ng-click="doThisShit(4)">
        {{ data }}
    /div>
</div>
Ответ написан
Комментировать
@lega
Вы можете изменить метод после первого вызова, что-бы он отдавал результат, например так:
$scope.myFunc = function(id) {
    var result = 'loading...';
    $scope.myFunc = function() { return result };
    $http.get($scope.url).success(function (data) {
        result = data;
    })
    return result
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы