gpt4 book ai didi

knockout.js - 如何将父函数添加到 KnockOut 双层嵌套映射中?

转载 作者:行者123 更新时间:2023-12-02 20:56:48 24 4
gpt4 key购买 nike

我使用 KnockOut 映射 fromJS 从 JSON 对象创建 View 模型,如下所示:

{
"cats": [{
"name": "fluffy",
"color": "brown",
"kittens": [{
"name": "spot",
"color": "brown"
}, {
"name": "rascal",
"color": "grey"
}, {
"name": "trouble",
"color": "white"
}]
}, {
"name": "kitty",
"color": "red",
"kittens": [{
"name": "lady",
"color": "red"
}, {
"name": "skat",
"color": "striped"
}]
}]
}

html:

<div data-bind="foreach:cats">
<span data-bind="text:name"></span>
<table>
<tr data-bind="foreach: kittens">
<td data-bind="text:name"></td>
<td data-bind="text:color"></td>
<td><a data-bind="click: $parent:showParentColor" href="#">Parent Color</a></td>
</tr>
</table>
</div>

Javascript:

var KittenModel = function (data) {
ko.mapping.fromJS(data, {}, this);

// ... various computed values added to this
}

var mapping = {
'kittens': {
create: function(options) {
return new KittenModel(options.data);
}
},
'otherItem': {
create: function(options) {
return ('otherStuff');
}
}
}

var data = { ... }; // the JSON above

var CatsViewModel = ko.mapping.fromJS(data, mapping);

问题:

如何放置 showParentColor() 函数,以便数据绑定(bind)在 kitten 表中起作用?例如:

function showParentColor(cat) {
alert(cat.color);
}

谢谢!

最佳答案

您可以根据您的 View 模型层次结构使用以下其中一项:

  • $root :这指向根上下文中的主视图模型对象。最顶层的父上下文。
  • $parents 数组:这是一个包含所有 View 模型的数组。

    • $parents[0] : 父 View 模型上下文。(也与$parent相同)

    • $parents[1]:第二个父 View 模型上下文。(祖 parent )

    • $parents[2]: 第三个父 View 模型上下文。 (曾祖 parent )

    • 等等......


更新:如果您想在 CatsViewModel 级别添加函数,只需将函数添加到创建的模型中即可。

示例:https://jsfiddle.net/kyr6w2x3/87/

JS:

 CatsViewModel.showParentColor = function(item){
console.log(item.name());
console.log(item.color());
}

查看:

<a data-bind="click: $parents[1].showParentColor">

下面是模型的层次结构

- CatsViewModel 
- cats : observableArray
- name : observable
- color : observable
- kittens : observableArray
- name : observable
- color : observable
- showParentColor : function


替代方案:您可以自己完成工作并创建模型。您可以更轻松地根据需要进行修改和维护。您还可以在任何内容中添加 click功能您想要的型号。

示例:http://jsfiddle.net/kyr6w2x3/91/

HTML:

<div data-bind="foreach:cats">
<span data-bind="text:name"></span>
<table>
<tbody data-bind="foreach: kittens">
<tr>
<td data-bind="text:name"></td>
<td data-bind="text:color"></td>
<td><a data-bind="click: $parent.showParentColor" href="#">Parent Color</a></td>
</tr>
</tbody>

</table>
</div>

JS:

 var data = {
"cats": [{
"name": "fluffy",
"color": "brown",
"kittens": [{
"name": "spot",
"color": "brown"
}, {
"name": "rascal",
"color": "grey"
}, {
"name": "trouble",
"color": "white"
}]
}, {
"name": "kitty",
"color": "red",
"kittens": [{
"name": "lady",
"color": "red"
}, {
"name": "skat",
"color": "striped"
}]
}]
}

var CatsViewModel = function (data){
var self = this;
self.cats = ko.observableArray($.map(data.cats, function (item) {
return new CatItemViewModel(item);
}));
}
var CatItemViewModel = function (data){
var self = this;
self.name = ko.observable(data.name);
self.color = ko.observable(data.color);
self.kittens = ko.observableArray($.map(data.kittens, function (item) {
var newData = Object.assign({}, item, { parent: self.name()});
return new KittenModel(newData);
}));
self.showParentColor = function (item){
console.log("Parent Name: " , self.name());
console.log("Name: " , item.name());
console.log("Color: " , item.color());
}
}
var KittenModel = function (data) {
var self = this;
self.name = ko.observable(data.name);
self.color = ko.observable(data.color);
self.parent = ko.observable(data.parent);
}
var vm = new CatsViewModel(data);
ko.applyBindings(vm);

关于knockout.js - 如何将父函数添加到 KnockOut 双层嵌套映射中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39966587/

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