Компоненты AngularJS - как передать внутреннюю переменную?
Я пытаюсь создать компонентную базу кода и застрял в этой проблеме.
При использовании $scopes и Controllers я передаю токен сервера моему методу вызова rest с помощью ng-init. Попытка сделать то же самое с Компонентом не работает.
Javascript
angular
.module('myApp', [])
.controller('mainCtrl', function() {
var self = this;
self.options = function() {
var o = {}
o.token = self.serverToken
return o;
}
self.restData = {
url: 'http://rest.url',
options: self.options()
}
})
.component('myComponent', {
bindings: {
restData: '<'
},
template: '<p>template, calls child components</p>',
controller: function(restService) {
this.callRestService = function() {
restService.get(this.restData.url, this.restData.options)
}
console.log(this.restData.url) // http://rest.url
console.log(this.restData.options) // {token: undefined}
}
})
HTML
<html ng-app="myApp">
<!-- head -->
<body ng-controller="mainCtrl as m" ng-init="m.serverToken='12345'">
<my-component rest-data="m.restData"></my-component>
</body>
</html>
Как передать значение компоненту?
1 ответ
Решение
Проблема в том, что ng-init выполняется после создания экземпляра контроллера. Однако вы создаете свой объект restData во время создания вашего контроллера, когда serverToken не определен.
Вы можете создать свой объект restData после вызова ng-init примерно так:
.controller('mainCtrl', function() {
var self = this;
self.restData = {};
self.init = function(token) {
self.serverToken=token;
self.restData = {
url: 'http://rest.url',
options: {token:token}
};
};
})
Ваш компонент может сделать что-то, когда эти restData изменятся. Например:
.component('myComponent', {
bindings: {
restData: '<'
},
template: '<p>template, calls child components</p>',
controller: function(restService) {
this.callRestService = function() {
restService.get(this.restData.url, this.restData.options)
}
this.$onChanges = function(changes) {
console.log(this.restData) // http://rest.url
console.log(this.restData.options) // {token: 12345}
this.callRestService();
}
}
});
HTML-код изменится для вызова вашего метода init:
<body ng-controller="mainCtrl as m" ng-init="m.init(12345)">
<my-component rest-data="m.restData"></my-component>
</body>