作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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 模型层次结构使用以下其中一项:
$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/
我是一名优秀的程序员,十分优秀!