я рабочий код, который выглядел так: (. Эта переменная объявлена вне модели представления)Нокаут JS-шаблон, не отображающий свойство объекта в наблюдаемом массиве?
var urlTemplate = "http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=XXX&type=card";
self.deck = [
{ id: 1, name: "Plains", mvId: 73963, imageUrl: urlTemplate.replace('XXX', '73963') },
{ id: 2, name: "Forest", mvId: 174928, imageUrl: urlTemplate.replace('XXX', '174928') }
];
((Этот массив, определенный в модели представления.) Это был шаблон.)
<div id="hand" data-bind="foreach: hand">
<div class="cardInHand">
<img height="150" data-bind="attr: { src: imageUrl, alt: name }" />
</div>
</div>
Как я уже говорил, этот вопрос хорошо, и шаблон правильно показал изображение, указанное в источнике.
Однако вместо добавления анонимного типа в массив я добавил новую модель представления, называемую «карта». Это изменение в основном было сделано для поддержки других функций, связанных с картой, не имело смысла в первой модели представления. Карта выглядит следующим образом:
var card = function (id, name, multiverseId) {
self = this;
self.id = ko.observable();
self.name = ko.observable();
self.multiverseId = ko.observable();
// other methods defined here ...
self.imageUrl = ko.computed(function() {
return imageUrlTemplate.replace('XXX', multiverseId);
}).extend({ notify: 'always' });
}
Затем изменил массив в первой модели представления, чтобы добавить карты, как это:
self.deck = [
new card(3, "Plains", 269637),
new card(4, "Forest", 376343)
];
И, наконец, шаблон таким:
<div id="hand" data-bind="foreach: hand">
<div class="cardInHand">
<img height="150" data-bind="attr: { src: $data.imageUrl, alt: $data.name }" />
</div>
</div>
It потребовалось некоторое время, чтобы избавиться от очевидных ошибок JavaScript, но как только они были очищены, конечный результат просто ничего не отображал.
Когда я открыл инструмент отладки Chrome, отправился в Elements и нашел div id 'hand', вычисленный элемент просто показал литеральный шаблон - никаких замен с фактическим значением. В исходной рабочей версии он отображает шаблон, но также имеет правильное заполнение значений src и alt.
Если я удалю данные $ из шаблона, я получаю ошибки javascript.
Как получить привязку к работе сейчас, когда у меня есть эти объекты карты?
Я добавил this JS Fiddle, чтобы продемонстрировать, что я делаю. При нажатии кнопки «Новая игра» вы можете увидеть работу старого кода, но не более новую версию.
Ваша проблема не имеет никакого отношения к выполните приведенный здесь код, но как «клонировать» ваши карты в методе 'resetBoardState'. Поскольку 'JSON.strigify (JSON.parse (self.deck))' не воссоздает ваши объекты 'card', поэтому ваши наблюдаемые свойства будут потеряны. Если вам не нужен настоящий глубокий клон, вы можете использовать 'self.deck.splice (0)': http://jsfiddle.net/uKNQB/ – nemesv