0

Я использую 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: '<' 
    } 

Обе службы возвращают один и тот же тип объекта и обе работают.

+0

Это работает, потому что сначала вы разрешение города в течение переходного периода. Когда это будет успешным, оба компонента получат значение разрешения 'city', привязанное к их входам. Когда вы изменяете значение 'vm.town', вы переписываете ссылку на родительский контроллер. Но дочерний контроллер не связан с родительским контроллером; он привязан к разрешенному значению. Если вы посмотрите на DOM, вы увидите '' –

+0

(... продолжение) Предлагаю вам обновить состояние 'cityId' param, чтобы город был повторно набрал чистоту. Если cityId не изменился, вы можете использовать опцию '{reload: 'town'}' transition, чтобы заставить город разрешить повторную выборку. –

+0

Привет, спасибо за ваш ответ. Я просто не понимаю, почему я могу сделать, например, 'vm.town.x = 666' в контроллере родительских компонентов, и все работает (изменения видны в компонентах дочерних состояний). Но только изменение vm.town путем вызова службы 'BuildingUpgradeRest.update()' не работает. Если я понимаю ваше предложение, это означает, что мне нужно позвонить в службы отдыха 2x за каждое изменение городского объекта (первый вызов для изменения, второй вызов в состоянии разрешения)? – chobotek

ответ

1
function TownCmpController(TownServices,Town,BuildingUpgradeRest) { 
    var vm = this; 
    this.upgradeBuilding = function(data) { 
    BuildingUpgradeRest.update({townId: vm.town.TownId,buildingId: data.building.BuildingId}).then(function (response) { 
     vm.town = response; 
    }) 
    } 
} 

Ваше возвращение сервиса обещание, так что вы reslove ответа службы, а затем настройки vm.towns

 Смежные вопросы

  • Нет связанных вопросов^_^