Я пытаюсь сделать довольно простое частичное обновление. Я обновляю свойство «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() + «##» необходима для объединения значений свойств с возможностью форматирования текста, в зависимости от того, некоторые свойства не являются пустыми.
У меня нет идей по этому вопросу.
Я чувствую, что есть действительный случай для ситуации, когда свойства могут быть нулевыми, так как в этом случае. Вот почему есть, если: person обертывает элемент, используя person.lastName. Что мне интересно, возможно ли такое использование вообще или нет? –
Ну, они могут быть нулевыми, но вы пытаетесь вызвать lastName() в своей привязке, но когда вы создаете свою модель, на ней нет такого наблюдаемого, поэтому она никогда не сможет работать. Фактически, вы инициализируете свой объект person как null, поэтому он даже не может получить свойство, чтобы проверить, является ли оно нулевым. –
Вы запустили скрипку? Там вы можете видеть, что ошибка возникает только при нажатии кнопки «Обновить данные», которая должна загружать данные с человеком и lastName. Я использую инструменты Chrome для этого, но я уверен, что Firebug покажет его. –