0

试图弄清楚如何在单页应用程序中按视图扩展我从微风.js 查询的实体。现在,当涉及到扩展(又名物化)它们时,微风正在充当守门人,我想知道还有哪些其他选项可以让我做到这一点。我最初是从 knockout 的映射插件开始的,但发现它出于某种原因拒绝处理子集合,所以我转而使用微风的构造函数和初始化方法。这样做的问题是您只能为实体定义一个自定义“模型”。我正在寻找允许基于每个视图的实体的自定义“模型”的方法。我已经排除了多个经理。多次查询元数据是一个巨大的不必要的打击,只是为了让它工作。

该图可视化了我想要实现的目标。最终查询View 1和两个视图都需要它们自己对“模型”的特定定制。由于首先加载它是“获胜”的自定义“模型”,并且没有机会对其进行自定义。当最终运行它的查询时,已经加载的任何类型的实体都将具有定义的自定义“模型”,这将在绑定期间爆炸。任何尚未加载的实体现在都将具有自定义“模型”,如果它甚至可以走那么远,最终会崩溃。看到这个帖子View 2Entity BEntity BView 1Entity BView 2View 2BView 1View 1View 2View 1View 2View 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);
}
4

1 回答 1

1

猜测您现在已经继续前进,但认为我会为处于类似位置的其他人提供建议。

我们对类似情况的解决方案借鉴了轻风.js TempHire示例解决方案,该解决方案实现了客户端存储库/uow 模式。该解决方案使用 EntityManagerProvider 来管理多个 EntityManager。EntityMananagerProvider 对元数据进行一次调用,然后用于创建新的子 EntityManager - 满足您对多个元数据调用的关注。然后,您可以使用自定义模型/uow/repositories 为特定视图扩展子管理器。

于 2013-07-16T02:03:47.120 回答