Передать в контроллер значение с сервера при инициализации
У меня в проекте есть страница редактирования сложного объекта 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, время: 15:35. |