Угловая вложенная модель не обновляется

У меня интересная проблема с angular-formly. Я пытаюсь использовать тег «модель», как показано ниже, потому что моя модель не плоская.

{
    'key': 'last',
    'model': 'model.name',
    'templateOptions: {}
} 

Однако я не могу обновить модель в чистом виде. Простая замена model или даже model.name на подходящую модель, содержащую обновленное значение, не приводит к тому, что модель обновляет представление.

var newModel = {
    name: {
        first: 'Gandalf',
        last: 'The White'
    }
};
self.model = {
    name: {
        first: 'Gandalf',
        last: 'The Grey'
    }
};
function setNewLastName() {
    self.model = newModel;
}
setNewLastName();

Однако, если я перехожу к конкретному свойству, он работает так, как ожидалось.

self.model.name.last = self.newModel.name.last;

Вот ссылка на JSBin, где значение обновляется с использованием метода детализации, описанного выше. Детализация JSBin

Другой JSBin, который пытается обновить модель, назначая новую модель, которая не обновляется. Назначить модель JSBin

Кто-нибудь сталкивался с этой проблемой или вы видите, где я делаю что-то не так?


person tuckerjt07    schedule 09.12.2015    source источник


Ответы (1)


Вы заменяете модель для каждого ключа, поэтому никогда не видите изменений.

Что вам нужно сделать, так это сопоставить модель с самим ключом.

vm.fields = [
  {
    key: 'name.first', // <-- HERE
    type: 'input',
    //model: vm.model.name, //Wrong
    templateOptions: {
      label: 'First Name'
    }
  },
  {
    key: 'name.first', // <-- AND HERE
    type: 'input',
    //model: vm.model.name, //Wrong
    templateOptions: {
      label: 'Last Name'
    }
  },
  //...
];

См. исправленный пример: http://jsbin.com/pupijoc/1/edit?js,console,output


ОБНОВЛЕНИЕ: вложенные свойства также обрабатываются полевыми группами.

Обновленный пример: http://jsbin.com/pupijoc/3/edit?js,console,output

person Ben Orozco    schedule 09.12.2015
comment
Это работает, но не решает проблему, для решения которой предназначен атрибут модели. Теперь вам нужно создать другой шаблон для каждого n вложенных свойств или реализовать переключение или скрытие показа. - person tuckerjt07; 09.12.2015
comment
Вложенные свойства лучше достигаются с помощью fieldGroups, позвольте мне обновить пример - person Ben Orozco; 09.12.2015
comment
Это тоже работает, но на самом деле это все еще хак/обходной путь. Согласно официальной документации, то, что я делаю, - это предполагаемый вариант использования «модели». Также очень нечисто иметь n слоев fieldGroups, обертывающих ваши поля, где некоторые могут быть двумя глубокими, а другие пятью. - person tuckerjt07; 09.12.2015
comment
Я не понимаю, зачем вам нужно указывать модель для каждого поля. В любом случае я попытался удалить привязку директивы в HTML: jsbin.com/gafinic/2 /edit?js,console,output , возможно, вы захотите поднять вопрос в нашем канале gitter: gitter.im/formly-js/angular-formly - person Ben Orozco; 10.12.2015
comment
Вот еще один пример использования модели в качестве формального выражения:jsbin.com/gafinic/edit?js,console ,output Это может быть ошибка или нужен наблюдатель: docs.angular-formly.com/docs/formly-expressions#watcher - person Ben Orozco; 10.12.2015
comment
Это было в Gitter, и я также создал проблему. API, которые я использую, вызывают проблемы с моделью. Я мог бы сгладить его и отобразить позже, но в данном случае это много накладных расходов. Я предположил, что отсутствует наблюдатель, а также обновления модели, значение просто не передается на экран. Если вы не возражаете, укажите мне правильный раздел в исходном коде, и я попытаюсь получить статус запроса на вытягивание. - person tuckerjt07; 10.12.2015
comment
Спасибо и за помощь. - person tuckerjt07; 10.12.2015