在客户端 ORM 中驯服 hasMany/belongsToOne 循环引用

Taming hasMany/belongsToOne circular reference in client side ORM

我在我的案例中使用 angular 但这也是一个一般性问题。我也知道其他前端 ORM 解决方案,如 js-data 和 restacular,但那是另一回事了。

给定一个由几个 Person 个实例组成的 People 集合:

[
    { name: "Bob" },
    { name: "Dave" },
    { name: "Sarah" }
]

每个 Person 实例如何能够(方法)将具有继承属性的自身新实例推送到其父集合中?假设 Person 实例如下所示:

{
    name: "Bob",
    parent: [ /* circular reference to collection */ ],
    extend: function(attrs) { /* returns new object */ },
    create: function(attrs) {
        var self = this;
        //call factory method to create object
        var person = self.extend(attrs);
        //some http call to persist to backend
        .then(function() {
            //push new instance to parent so it's rendered in the view model
            self.parent.push(person);
        });
    }
}

也许这种封装方法不好...我不确定。我让 a plnkr 尝试创建一个指令,该指令通过双向绑定继承 JSON 字符串化循环引用(不好)。

指令

angular
    .module("app", [])
    .directive("appDirective", function() {
        return {
            scope: { data: "=appDirective" },
            bindToController: true,
            controllerAs: "vm"
        };
    });

html

<div app-directive="{foo: 'bar', info: vm.info}">{{vm.data}}</div>

父控制器内部

this.info = {};
//setup circular reference
this.info.info = this.info

如何在解决循环 JSON 字符串化问题的同时,在我的 ORM 中保留循环引用的优势?

您需要编写自己的 stringify,将对象拉出到引用数组并用引用数组键替换它们。或者您可以使用我发现有用的 jsog

此外,如果您有兴趣尝试自己做,这个 Whosebug 回答