2013-06-04 13 views
0

Я пытаюсь сделать довольно простое частичное обновление. Я обновляю свойство «person» моделей моделей представлений, которое изначально имеет значение null, с объектом со своим дочерним свойством «lastName». При попытке уведомить абонентов это не удается с помощью метода no.listName().Knockout.js не удалось обновить предыдущие дочерние элементы

Fiddle демонстрации выпуск: http://jsfiddle.net/P4Jd3/4/

HTML

<body> 
    <hr/> 
    <div data-bind="text: rootdata"></div> 
    <hr/> 
    <div data-bind="if: person"> 
    <div data-bind="text: person.lastName()?person.lastName()+'###':'foo'"> 
    </div> 
    </div> 
    <hr/> 
    <input type="submit" data-bind="click: updatedata" value="update data"></input> 
</body> 

JS:

newdata = { 
    person: { 
     lastName: "Mr.Bar" 
    }, 
    rootdata : "Root 2" 
} 

model = { 
    self: this, 
    person : ko.observable(null), 
    rootdata : ko.observable("Init root"), 
    updatedata: function() { 
     ko.mapping.fromJS(newdata, {}, model); 
    } 
} 

ko.applyBindings(model); 

В момент обновления, я получаю ошибку о том, что функция объекта [ко наблюдаемая строка нежелательной ] не имеет метода lastName().

Message: TypeError: Object function d(){if(0<arguments.length){if(!d.equalityComparer||!d.equalityComparer(c,arguments[0]))d.H(),c=arguments[0],d.G();return this}b.r.Wa(d);return c} has no method 'lastName'; 
Bindings value: text: person.lastName()?person.lastName()+'###':'foo' 

Это person.lastName() + «##» необходима для объединения значений свойств с возможностью форматирования текста, в зависимости от того, некоторые свойства не являются пустыми.

У меня нет идей по этому вопросу.

ответ

3

Ваш объект person не имеет свойства lastname, не говоря уже о наблюдаемом, когда вы вызываете applyBindings. Он создается только при вызове upadteData.

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

model = { 
    self: this, 
    person : ko.observable({ lastName: ko.observable('')}), 
    rootdata : ko.observable("Init root"), 
    updatedata: function() { 
     ko.mapping.fromJS(newdata, {}, model); 
    } 
} 

ko.applyBindings(model); 
+0

Я чувствую, что есть действительный случай для ситуации, когда свойства могут быть нулевыми, так как в этом случае. Вот почему есть, если: person обертывает элемент, используя person.lastName. Что мне интересно, возможно ли такое использование вообще или нет? –

+0

Ну, они могут быть нулевыми, но вы пытаетесь вызвать lastName() в своей привязке, но когда вы создаете свою модель, на ней нет такого наблюдаемого, поэтому она никогда не сможет работать. Фактически, вы инициализируете свой объект person как null, поэтому он даже не может получить свойство, чтобы проверить, является ли оно нулевым. –

+0

Вы запустили скрипку? Там вы можете видеть, что ошибка возникает только при нажатии кнопки «Обновить данные», которая должна загружать данные с человеком и lastName. Я использую инструменты Chrome для этого, но я уверен, что Firebug покажет его. –

0

просто удалить () из lastName собственности. Потому что это не наблюдаемое свойство

ИЛИ редактировать код, чтобы определить новую модель для ваших данных с наблюдаемыми свойствами

2

Это идеальным вариантом использование для with связывания. Если заменить if: person с with: person, это упрощает код и просто работает:

<div data-bind="with: person"> 
    <div data-bind="text: lastName() ? lastName()+'###' : 'foo'"></div> 
</div> 

http://jsfiddle.net/mbest/P4Jd3/5/

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