Knockout обновляет только часть модели представления - PullRequest
0 голосов
/ 03 июля 2019

давайте предположим, что режим просмотра из JS

var js = { 
            Foo1 : {
                BarA : 'text',
                BarB : 'other text' },
            Foo2 : {
                BarC : 'some text' }}; 

 var vm = ko.mapping.fromJS(js);
  ko.applyBindings(vm);

Теперь я могу сделать

vm.Foo1.BarB('hello world');

Я также могу сделать что-то вроде

var js = { 
            Foo1 : {
                BarA : 'text',
                BarB : 'hello world' },
            Foo2 : {
                BarC : 'some text' }}; 

 ko.mapping.fromJS(js, vm);

Оба сценария обновляют любое полепривязан к vm.Foo1.BarB

Я хотел бы сделать что-то вроде

var foo = {
               BarA : 'text',
               BarB : 'hello world' }; 

     ko.mapping.fromJS(foo, vm.Foo1);

Это не работает, я также пытался

vm.Foo1(ko.mapping.fromJS(foo));
//and
vm.Foo1 = ko.mapping.fromJS(foo);

Ничего изони работают.

Мне это нужно, потому что в моем реальном сценарии моя модель возвращается из веб-службы, также возвращаются обновления Foo1 и Foo2, и я не хочу слишком много пользовательских сопоставлений.

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Насколько я знаю, это невозможно.Но вы можете сделать это:

var js = { 
            Foo1 : {
                BarA : 'text',
                BarB : 'other text' },
            Foo2 : {
                BarC : 'some text' }}; 

var vm = ko.mapping.fromJS(js);
ko.applyBindings(vm);

//later, after fetching data from the webservice:
//data = {
//   Foo1 : {
//      BarA : 'text',
//      BarB : 'other text' },
//}; note: Foo2 is not defined

ko.mapping.fromJS(data, {}, vm);

После сопоставления будет обновлен только Foo1 (и его дочерние элементы).

0 голосов
/ 03 июля 2019

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

То естьу вас есть результат API:

{
   name: 'Ryan',
   title: 'Developer'
   gender: 'M',
   birthDate: '01-01-1984',
   employeeCode: '0123156'
}

Таким образом, вы используете это по всей разметке с кучей вещей вроде:

<label data-bind="text: user.employeeCode"></label>

У вас есть полеимена, написанные по всей разметке в сотнях местВы полагаетесь на них в вычисляемых наблюдаемых, функциях, и так далее, и так далее.У вас 100% жесткая зависимость от этого API.

Если бы этот API-интерфейс был изменен или заменен и имел другой формат для возвращаемых данных, у вас был бы полный разрыв приложения и вам пришлось быисправьте так много всего.

С другой стороны, если у вас есть js-файл сервисного слоя, который создает экземпляры пользовательских объектов для результатов API, все, что вам нужно изменить, - это сервисный уровень.

Вы можете легко переключать API, и вам не нужно менять какие-либо ваши наблюдаемые, привязки пользовательского интерфейса и так далее.Вы создали связующий слой между приложением и его внутренними данными, и вы можете поменять местами связи, чтобы изменить весь бэкэнд.

Я знаю, что это не ответ на ваш вопрос, но я бы подумал, что вы apiстратегия отображения результатов или принять ее во внимание.

0 голосов
/ 03 июля 2019

Видимо, есть какой-то загадочный дополнительный параметр ..

ko.mapping.fromJS(foo, {}, vm.Foo1);

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

https://stackoverflow.com/a/29598785/2968001

...