Передать в контроллер значение с сервера при инициализации
У меня в проекте есть страница редактирования сложного объекта 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. Подскажите пожалуйста, куда смотреть в доках, и как это вообще принято делать в ангуляре ? |
Я, очевидно, что-то делаю кардинально не так, но у меня упорно не получается передать данные из html в контроллер при помощи двустороннего связывания.
Пример: http://jsfiddle.net/entrust/6LJx3/4/ Объясните пожалуйста, почему данные из ng-init и ng-model не попадают в контроллер ? И, самое главное, как же все же можно передать данные из сгенеренного сервером html в angular-приложение ? Во всех туториалах я вижу максимум разбор урла, $location. Но у меня не одностраничник, у меня роутинг вообще не используется. |
Отвечу сам себе, для тех, кто напорется на такую же проблему (а это каждый второй, имхо). Встроенного решения в ангуляр нету. Передавать значения в контроллер при его инициализации можно, присваивая в html эти значения переменным из неймспейса window и читая их в контроллере - http://jsfiddle.net/entrust/6LJx3/7/
Для тех, кто пишет php, для совершения подобных манипуляций может быть полезным вот этот модуль: https://github.com/laracasts/PHP-Vars-To-Js-Transformer |
http://jsfiddle.net/6LJx3/8/
Цитата:
|
Дело, видимо, в том, что сперва инициализируются переменные в контроллере, а уже потом в директивах.
Можно сделать обертку .$watch и все сработает. Например так: http://plnkr.co/edit/q6XAyx7WjEJfY3WCpfsA |
Есть способы. Просто они напрямую не документированны.
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, время: 19:19. |