我已經工作,看起來像這樣的代碼:(該變量視圖模型之外聲明)Knockout 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>
正如我所提到的,這個工作ked和模板正確顯示了源中列出的圖像。
但是,我沒有給數組添加一個匿名類型,而是添加了一個名爲「card」的新視圖模型。這種改變主要是爲了支持與卡片相關的其他功能在第一視圖模型中沒有意義。卡看起來是這樣的:
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>
它花了一段時間擺脫了明顯的JavaScript錯誤,但一旦他們被清除,最終結果根本沒有顯示任何東西。
當我打開Chrome的調試工具時,轉到Elements,發現div id'hand'計算的元素只是顯示了文字模板 - 沒有用實際值替代。在原始工作版本中,它顯示模板,但也有src和alt值正確填寫。
如果我從模板中刪除$ data,則會收到javascript錯誤。
現在我有這些卡片對象,我該如何讓綁定工作?我加了this JS Fiddle來證明我在做什麼。當點擊新遊戲時,你可以看到舊代碼工作,但不是新版本。
您的問題無關在這裏使用顯示的代碼,但是如何在「resetBoardState」方法中「克隆」你的卡片。因爲'JSON.strigify(JSON.parse(self.deck))'不會重新創建'卡'對象,所以您的可觀察屬性將會丟失。如果你不需要真正的深度克隆,你可以使用'self.deck.splice(0)':http://jsfiddle.net/uKNQB/ – nemesv