试图弄清楚如何在单页应用程序中按视图扩展我从微风.js 查询的实体。现在,当涉及到扩展(又名物化)它们时,微风正在充当守门人,我想知道还有哪些其他选项可以让我做到这一点。我最初是从 knockout 的映射插件开始的,但发现它出于某种原因拒绝处理子集合,所以我转而使用微风的构造函数和初始化方法。这样做的问题是您只能为实体定义一个自定义“模型”。我正在寻找允许基于每个视图的实体的自定义“模型”的方法。我已经排除了多个经理。多次查询元数据是一个巨大的不必要的打击,只是为了让它工作。
该图可视化了我想要实现的目标。最终查询View 1
和两个视图都需要它们自己对“模型”的特定定制。由于首先加载它是“获胜”的自定义“模型”,并且没有机会对其进行自定义。当最终运行它的查询时,已经加载的任何类型的实体都将具有定义的自定义“模型”,这将在绑定期间爆炸。任何尚未加载的实体现在都将具有自定义“模型”,如果它甚至可以走那么远,最终会崩溃。看到这个帖子。View 2
Entity B
Entity B
View 1
Entity B
View 2
View 2
B
View 1
View 1
View 2
View 1
View 2
View 1
我的想法是为每个具有Entity observable 的视图手动创建我自己的自定义“模型”,然后我可以迭代从微风查询返回的每个实体并新建这个自定义“模型”并传入当前项目,分配它到实体属性。我真的不想这样做,因为我现在到处都有大量的迭代代码,我更愿意使用淘汰赛的映射插件。伪代码:
function view1EntityBModel(entity) {
var self = this;
self.Entity = ko.observable(entity);
self.myCustomProperty = ko.observable();
...
}
function view2EntityBModel(entity) {
var self = this;
self.Entity = ko.observable(entity);
self.isExpanded = ko.observable(false);
...
}
我想知道是否有任何其他解决方案可以实现同样的目标?
或者更好的是,有人知道如何使淘汰映射插件在子集合上工作吗?
我认为这里的问题是,当映射插件获取微风数据时,Children
集合已经转换为可观察数组,并且映射插件不知道它需要Children()
按顺序“调用”该属性取回一份清单。
var categoryMapper = {
create: function (options) {
return new categoryModel(options.data);
},
Children: { // this doesn't fire for the children
create: function (options) {
return new categoryModel(options.data);
}
}
}
function categoryModel(data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
}