Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Передать в контроллер значение с сервера при инициализации (https://javascript.ru/forum/angular/45453-peredat-v-kontroller-znachenie-s-servera-pri-inicializacii.html)

entrust 01.03.2014 11:39

Передать в контроллер значение с сервера при инициализации
 
У меня в проекте есть страница редактирования сложного объекта object, который состоит из массы под-объектов rows и items. Решил сделать его редактирование на ангуляре, но с толкнулся с тем, что я не понимаю, как передать контроллеру id объекта, который надо показывать для редактирования.

Пытался сделать это при помощи ng-init и ng-model в скрытом инпуте (понимаю, это скорее всего нехорошо), но ни то ни другое не работает.

Кусок серверной вьюхи:
<div ng-controller="EditRowsCtrl" ng-init="objectId=<?= $object->object_id ?>">

	<input type="hidden" ng-model="objectId" value="<?= $object->object_id ?>">

	<div-loader ng-hide="{{isDataLoaded}}"></div-loader>
	<div-error ng-show="{{isDataNotLoaded}}" message="Не удалось загрузить данные."></div-error>

	<p>#{{objectId}}</p>

	<div ng-repeat="row in rows">
		<edit-row-pre row="row"></edit-row-pre>
	</div>

</div>


Контроллер:
msApp.controller("EditRowsCtrl", function($scope, $http){
	$scope.rows = $http.get("/api/v1/object/rows/"+$scope.objectId)
		.success(function(data, status, headers, config){
				$scope.isDataLoaded = true;
		})
		.error(function(data, status, headers, config){
				$scope.isDataLoaded = false;
				$scope.isDataNotLoaded = true;
		});

});


На странице objectId отображается корректно, а в контроллере $scope.objectId значится undefined.
Подскажите пожалуйста, куда смотреть в доках, и как это вообще принято делать в ангуляре ?

entrust 01.03.2014 21:13

Я, очевидно, что-то делаю кардинально не так, но у меня упорно не получается передать данные из html в контроллер при помощи двустороннего связывания.

Пример: http://jsfiddle.net/entrust/6LJx3/4/

Объясните пожалуйста, почему данные из ng-init и ng-model не попадают в контроллер ? И, самое главное, как же все же можно передать данные из сгенеренного сервером html в angular-приложение ? Во всех туториалах я вижу максимум разбор урла, $location. Но у меня не одностраничник, у меня роутинг вообще не используется.

entrust 02.03.2014 17:47

Отвечу сам себе, для тех, кто напорется на такую же проблему (а это каждый второй, имхо). Встроенного решения в ангуляр нету. Передавать значения в контроллер при его инициализации можно, присваивая в html эти значения переменным из неймспейса window и читая их в контроллере - http://jsfiddle.net/entrust/6LJx3/7/

Для тех, кто пишет php, для совершения подобных манипуляций может быть полезным вот этот модуль: https://github.com/laracasts/PHP-Vars-To-Js-Transformer

nerv_ 12.03.2014 00:16

http://jsfiddle.net/6LJx3/8/

Цитата:

Сообщение от entrust
присваивая в html эти значения переменным из неймспейса

а я и не знал, что в html есть переменные и им можно что-нибудь присваивать :)

dleonid 21.03.2014 15:50

Дело, видимо, в том, что сперва инициализируются переменные в контроллере, а уже потом в директивах.
Можно сделать обертку .$watch и все сработает. Например так:
http://plnkr.co/edit/q6XAyx7WjEJfY3WCpfsA

Ruzarh 29.04.2014 21:48

Есть способы. Просто они напрямую не документированны.
angular.module('app', [])

    .controller('ctrl', ['$scope', 'superData', function($scope, superData) {
        console.log(superData);
    }]);

angular.element(document).ready(function () {

    angular.module('app').value({'superData':'superInfo'});

    angular.bootstrap(document.html, ['app']);
});


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