Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Как правильно передать URL (https://javascript.ru/forum/angular/54297-kak-pravilno-peredat-url.html)

GibsonG 12.03.2015 13:54

Как правильно передать URL
 
Здравствуйте! Сразу извиняюсь, только только начал изучать данный фреймворк и хотелось бы сразу делать правильно.

Есть контроллер в котором имеется $http сервис get с запросом на сервер. путь не относительный т.к. рестфул располагается на поддомене.
Причем домен хардкором указать не могу т.к. есть тестовый сервер где соответственно другой домен.

Вообще суть задачи обратится к серверу, и через ng-repeat вывести данные на страницу.

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

projectForm.controller('ProjectForm', ['$scope','$http', function($scope, $http) {
    $http.get('***')
}]);


Сам урл формируется на пхп фреймворке.

Просто в том же JQuery можно запихать в data атрибут например data-url="путь к апи".

Как я понимаю в ангуляр можно сделать нечто подобное, но:
1. контроллер не имеет доступа (точней не должен по хорошему) к DOM и нужно использовать директивы
2. директива инкапсулирована и не имеет доступа к контроллеру. И тут нужно сливать области видимости контроллера и директивы.

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

ksa 12.03.2015 19:41

GibsonG, вот пример связки "директивы повторения" и "данных контроллера"
http://angular.ru/tutorial/step_02

А вот пример работы с http...
http://angular.ru/tutorial/step_05

GibsonG 12.03.2015 19:58

Возможно или я не увидел что мне нужно, или вы не так меня поняли.

К примеру есть сервис в контроллере взятый из примера на сайте
var phonecatApp = angular.module('phonecatApp', []);
    phonecatApp.controller('PhoneListCtrl', function ($scope, $http) {
    $http.get('phones/phones.json').success(function(data) {
    $scope.phones = data;
    });
    $scope.orderProp = 'age';
    });

здесь мы видим что $http.get() имеет относительный путь. В моем случае путь абсолютрый http://api.domain.ru и сам этот адрес строится при генерации шаблона странице в пхп фреймворке и может быть на тестовом домене один, на продакшине другой. И задача состоит в том чтобы протащить этот адрес.
Вариан который я вижу сделать как-то так
<div data-urlToApi="http://api.domain.ru"></div>

где адрес будет генерироваться с участием php на основе роутов фреймворка.

MetaDriver 13.03.2015 05:28

Цитата:

Сообщение от GibsonG (Сообщение 360908)
Здравствуйте! .....

Сам урл формируется на пхп фреймворке.

Просто в том же JQuery можно запихать в data атрибут например data-url="путь к апи".

Как я понимаю в ангуляр можно сделать нечто подобное, но:
1. контроллер не имеет доступа (точней не должен по хорошему) к DOM и нужно использовать директивы
2. директива инкапсулирована и не имеет доступа к контроллеру. И тут нужно сливать области видимости контроллера и директивы.

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

Решается многими способами. Например так (в одну строчку):
<some-dir  ng-controller='myRestCtrl' ng-init='restBase = <?php echo $restBasePath ?>'>
........
</some-dir>

ksa 13.03.2015 08:10

Цитата:

Сообщение от GibsonG
Вариан который я вижу сделать как-то так
<div data-urlToApi="http://api.domain.ru"></div>

Не факт, что на момент вызова запроса тот ДОМ элемент будет существовать.

GibsonG 13.03.2015 08:53

Цитата:

Не факт, что на момент вызова запроса тот ДОМ элемент будет существовать.
Ну дело даже не в том. даже если подключать в конце скрипты (дом по идее должен уже построиться) сначала запускается контроллер а после отрабатываются директивы и в контроллере приходит undefined значение.

Как выход сделать так, :

$scope.$watch('restBase', function(val){
        console.log($scope.restUrl);
    });


но насколько это верно т.к. насколько я понимаю от вешает наблюдателя на директивы?


Цитата:

Решается многими способами. Например так (в одну строчку):
А какие способы есть еще? :)

ksa 13.03.2015 15:03

Цитата:

Сообщение от GibsonG
Как выход сделать так, :

$scope.$watch('restBase', function(val){
        console.log($scope.restUrl);
    });

Ты не тем занимаешься... :)

Серверный скрипт, при формировании страницы, может записать любое значение в любое место. ;)
Пиши сразу в нужное тебе место и будет тебе счастие...

GibsonG 13.03.2015 21:27

это как я тебе на php странице напишу в js файл? :)
Я же не буду javascript код пихать в представление php.
токен сам то можно из куков достать. а вот с другими параметрами сложне

ksa 13.03.2015 22:18

Цитата:

Сообщение от GibsonG
это как я тебе на php странице напишу в js файл?

Я х/з как там ваш ПХП... Я на CSP могу написать в любое место. Я формирую страницу! Куда хочу - туда и пишу.

Страницу ты формируешь? Можешь создать глобальную js переменную? Вот создай и в конструкторе ее используй.

И не фик меня пугать всякими новомодними словечками... :D

GibsonG 14.03.2015 00:06

в общем я тебя понял :yes:
но глобальные переменные как раз и следует избегать. Не зря в MVC модель контроллер и представление изолируют. И где ты видел новомодные словечки? :lol:

MetaDriver 14.03.2015 08:35

Цитата:

Сообщение от GibsonG (Сообщение 361139)
это как я тебе на php странице напишу в js файл? :)

Ну ты можешь написать в тег <script>. В принципе что угодно. Например модуль на ангуляре... ;)
Я вот тебе написал пожалуй самый "минимальный" способ доставки значения прямо в ангулар-контроллер практицки не требующий городить java-script на PHP.
Или что, в пыхе начались какие-то проблемы с генерацией строк? :blink:
// Извини, я не отслеживаю изменения в последних версиях... не успеваю за прогрессом... :lol:
Цитата:

Сообщение от GibsonG (Сообщение 361139)
А какие способы есть еще?

См. выше ;)

MetaDriver 14.03.2015 11:02

Цитата:

Сообщение от GibsonG (Сообщение 361156)
но глобальные переменные как раз и следует избегать. ........Не зря в MVC ...

Вапчета базовый адрес rest-хоста, это одна из немногих вещей, которые вполне уместно хранить в глобальной переменной.
Хотя конечно спроси у папы, если что.... мало ли... :)


Часовой пояс GMT +3, время: 19:44.