Я использую AngularJS 1.5, ui-router и угловой ресурс, и я разрабатываю компонентное приложение. У меня есть одно родительское состояние, которое используется для получения и обновления данных, эти данные привязаны к нескольким дочерним состояниям через родительский преобразователь состояния.AngularJS - Решенные данные не обновляются во вложенных компонентах состояния
Когда я вручную изменяю данные в контроллере родительских компонентов (например, vm.town.x = 666
), все работает нормально, и изменение отображается в компонентах дочернего состояния. Однако, когда я изменяю данные в контроллере родительских компонентов из ответа службы отдыха (используя угловой ресурс), изменение данных отображается только в компоненте родительского состояния.
состояние определение:
.state('town', {
url: '/my-towns/:townId/',
component: 'town',
bindings: {
town: 'townData'
},
resolve: {
townData: function(Town, $stateParams) {
return Town.get({
townId: $stateParams.townId
});
}
}
})
.state('town.detail', {
url: 'detail',
component: 'townDetail',
bindings: {
town: 'townData'
}
})
определение родителя (город) Контроллер компонента:
function TownCmpController(TownServices,Town,BuildingUpgradeRest) {
var vm = this;
this.upgradeBuilding = function(data) {
vm.town = BuildingUpgradeRest.update({townId: vm.town.TownId,buildingId: data.building.BuildingId});
}
остальное определение сервиса:
.factory('BuildingUpgradeRest',function($resource){
return $resource('api/public/v1/myaccount/towns/:townId/buildings/:buildingId/upgrade', {townId:'@townId', buildingId: '@buildingId'}, {
'update': {
method: 'PUT'
}
});
})
'город' объект связывания является одинаковым в обоих компонентах
bindings: {
town: '<'
}
Обе службы возвращают один и тот же тип объекта и обе работают.
Это работает, потому что сначала вы разрешение города в течение переходного периода. Когда это будет успешным, оба компонента получат значение разрешения 'city', привязанное к их входам. Когда вы изменяете значение 'vm.town', вы переписываете ссылку на родительский контроллер. Но дочерний контроллер не связан с родительским контроллером; он привязан к разрешенному значению. Если вы посмотрите на DOM, вы увидите ' town-detail>' –
(... продолжение) Предлагаю вам обновить состояние 'cityId' param, чтобы город был повторно набрал чистоту. Если cityId не изменился, вы можете использовать опцию '{reload: 'town'}' transition, чтобы заставить город разрешить повторную выборку. –
Привет, спасибо за ваш ответ. Я просто не понимаю, почему я могу сделать, например, 'vm.town.x = 666' в контроллере родительских компонентов, и все работает (изменения видны в компонентах дочерних состояний). Но только изменение vm.town путем вызова службы 'BuildingUpgradeRest.update()' не работает. Если я понимаю ваше предложение, это означает, что мне нужно позвонить в службы отдыха 2x за каждое изменение городского объекта (первый вызов для изменения, второй вызов в состоянии разрешения)? – chobotek