gpt4 book ai didi

knockout.js - CoffeeScript、 knockout 和可观察的

转载 作者:行者123 更新时间:2023-12-04 03:01:48 24 4
gpt4 key购买 nike

我有以下 CoffeeScript 来为 Knockoutjs 生成 Javascript

class NewsItem
content: ko.observable("")
title: ko.observable("")

constructor: (data,dispForm) ->
@content data.get_item("content")
@title data.get_item("title")
@id = data.get_id()

class NewsItemViewModel
collection: ko.observableArray()

loadAll: =>
listEnumerator = items.getEnumerator()
while listEnumerator.moveNext()
currentItem = listEnumerator.get_current()
@collection.push new NewsItem currentItem, @list.get_defaultDisplayFormUrl()
return

$ ->
viewModel = new NewsItemViewModel
ko.applyBindings viewModel
return

要呈现 HTML,我使用此代码
<ul id="results" data-bind="template: {name: 'item_template', foreach: collection}">
</ul>
<script id="item_template" type="text/x-jquery-tmpl">
<li>
<h3><a href="/" data-bind="text: title"></a></h3>
<p>
<textarea data-bind="value: content"></textarea>
<input type="button" value="save" data-bind="enable: content().length > 0">
</p>
</li>
</script>

但是,在 HTML 中,所有项目都显示添加到集合中的最后一个 NewsItem 的值。

有什么提示吗?

最佳答案

好的,这可能是 CoffeeScript 的缺陷之一:

class NewsItem
content: ko.observable("")

在这里,您正在创建一个新类,其属性“内容”是一个可观察对象。这将编译为以下 JavaScript:
var NewsItem = (function() {
function NewsItem() {}
NewsItem.prototype.content = ko.observable("");
return NewsItem;
})();

如您现在所见,属性“content”附加到原型(prototype)。这意味着:只创建了一个可观察对象,而不是每个实例一个。所以每当你这样做 new NewsItem ,构造函数更新原型(prototype)中的这个单个可观察对象,因此所有实例的值相同。

要解决这个问题,只需在构造函数中创建 observable。这样,它会附加到实例,而不是原型(prototype):
class NewsItem
constructor: (data,dispForm) ->
@content = ko.observable data.get_item("content")

编译成(相关部分):
this.content = ko.observable(data.get_item("content"));

关于knockout.js - CoffeeScript、 knockout 和可观察的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11235095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com