【发布时间】:2015-04-01 13:19:26
【问题描述】:
我一直在学习 KO,但只知道我真的花时间用它从头开始创建一个小项目。
我无法理解我的问题,我将简要解释一下逻辑:
您有页面,这些页面可以有页面(子页面)。
/* Defines a Page */
var page = function(ID, alias, body, connections) {
this.ID = ko.observable(ID);
this.alias = ko.observable(alias);
this.body = ko.observable(body);
this.connections = ko.observableArray(connections);
};
var dummyPages = [
new page(1, 'Alias #1', 'Body #1', [5]),
new page(2, 'Alias #2', 'Body #2', []),
new page(3, 'Alias #3', 'Body #3', [2,3]),
new page(4, 'Alias #4', 'Body #4', [5]),
new page(5, 'Alias #5', 'Body #5', [6]),
new page(6, 'Alias #6', 'Body #6', [7]),
new page(7, 'Alias #7', 'Body #7', [1, 4])
];
我在这里要做的是使用一个计算函数,它将放置在 foreach html 元素上。
<tbody data-bind="foreach: foreachConnectionAliases" style="text-align: left">
它会做的基本上是获取页面的孩子信息。
这是我的代码:
/* Return the pages that are connected to the clicked one */
this.foreachConnectionAliases = ko.computed(function(){
alert(this.chPages);
if(typeof this.chPages === "undefined")
return null;
var filtered = ko.utils.arrayFilter(this.chPages(), function(page) {
return this.filterByThisPage(page.ID());
});
debugger;
return filtered;
}).bind(this);//, { deferEvaluation: true });
/* Finds out if the activeConnection exists for the page we want */
this.filterByThisPage = function(pageID){
alert('filterByThisPage');
ko.utils.arrayForEach(getPageConnections(), function(id) {
if(id === pageID) return true;
});
return false;
}.bind(this);
/* Receive a page ID and get its connections array */
this.getPageConnections = function(){
alert('getPageConnections');
var getConnections = ko.utils.arrayFirst(this.chPages(), function(page){
return this.activeConnection() === page.ID();
});
return getConnections.connections();
}
如您所见,我在路上的某处放置了许多警报。计算函数中的警报只触发一次,我认为这是由于返回 null。
需要注意的重要一点是,假设我希望它在我们更改 this.activeConnection() 的值时触发,它是一个可观察变量,保存我们单击的页面的 ID(查看子页面)。
非常感谢任何关于修复代码以及使其更干净的想法,因为我相信我过于复杂了。
编辑:
我还尝试了 deferEvaluation: true ,在这种情况下,我的 foreach 数据绑定总是出现未定义的错误。
编辑 2:
http://jsfiddle.net/g1q99jr8/6/
这简要说明了我的情况。 HTML部分可能有一些错误。
【问题讨论】:
-
我并不完全清楚您要做什么。什么是
this.chPages,什么是page?您是要显示所有pages中的所有connections,还是要显示特定页面的connections?在最后一种情况下,您可以将当前活动页面放入可观察对象中,将连接列表父元素的范围设置为该可观察对象(例如with: currentPage),然后在connections属性上执行foreach(例如@ 987654335@). -
您好 CornéM 感谢您的回答。 chPages() 是所有页面,它是 var dummyPages 的可观察数组。我要展示的是单个页面的所有连接(子)(因此 chPages() 中的单个记录)。我这样做的原因是,如果您注意每个页面,您会发现连接是一堆 ID,因此我需要遍历所有 chPages() 来获取信息(别名和正文)。你明白我的意思吗?
-
如果你能分叉这个样本小提琴并解释你的案例会更好jsfiddle.net/supercool/LkqTU/22317。干杯
-
感谢您的回答超级酷。一旦我得到更改并用它编辑我的帖子,我就会这样做。
-
编辑超酷:) jsfiddle.net/g1q99jr8/6
标签: jquery html knockout.js foreach