【发布时间】:2018-12-05 11:20:30
【问题描述】:
如何调整下面的代码,以便只有“viewNotes”属性变得可观察?
我需要从服务器读取数据并将其应用于 ObservableArray。在数据中的所有属性中,只有 viewNotes 属性需要是可观察的。其他一切都不需要 2 路数据绑定。
这是来自服务器的数据:
var data = [
{
"itemName": "Item 1",
"notes": "This is item 1",
"viewNotes": false
},
{
"itemName": "Item 2",
"notes": "This is item 2",
"viewNotes": false
}
]
然后我将它数据绑定到页面,如下所示。这个想法是显示数据,但“notes”属性是隐藏的,除非用户单击以查看它。这个可见性切换链接到 viewNotes 属性 - 因此它需要是可观察的,而其他任何东西都没有。
<div data-bind="foreach: items">
<div data-bind="text: itemName"></div>
<button data-bind="click: $parent.viewTheNotes">View Notes</button>
<div data-bind="if: viewNotes">
<div data-bind="text: notes"></div>
</div>
<hr>
</div>
问题是我似乎无法调整映射插件以将数据带入 observableArray,而每个数组元素的“viewNotes”属性都是可观察的。这是我的代码:
var mapping = {
"include": ["viewNotes"]
};
ko.mapping.fromJS(data, mapping, self.items);
alert("is viewNotes observable: " + ko.isObservable(self.items()[0].viewNotes));
alert("is itemName observable: " + ko.isObservable(self.items()[0].itemName));
如您所见,警告框告诉我们每个数组元素的所有子属性似乎都已映射到可观察对象。
如何调整它以便只有 viewNotes 属性是可观察的?
这是一个显示问题的小提琴: https://jsfiddle.net/gxreh8sy/27/
【问题讨论】:
-
ko-mapping plugin的确切用途是什么?我问这个的原因是因为文档特别说:All properties of an object are converted into an observable. If an update would change the value, it will update the observable.你可能会发现这个here 和ctrl+f-How things are mapped。还有一些方法可以在没有插件的情况下实现这一点。
标签: knockout.js knockout-mapping-plugin knockout-3.0