1

我只是注意到 object 的 object child 有 id 但不是我在尝试获取 object 变量时想要的。我想在对象的对象中存储什么,但我只找到了 id?

例如,我使用场景管理对象来保存和加载以便于访问。

{ x:0, y:0, z:0, 参数:{height:0,width:0} }

保存的结果是当我检查数据时发现它不同。

{ x:0, y:0, z:0, prarms:#randomids }

如果对象使用 uuid 匹配,我使用 set 和 put。需要一些帮助来了解它是如何工作的。想要获取整个对象数据,而不是 gundb 对象 ID。


设法获得部分工作代码以进行设置并让数据对象部分工作。这里简单的版本如何设置。

//console.log("saving object data????");
        this.check_gunsceneobj(obj['uuid'],(bfind,id)=>{
            //console.log("....CALLS");
            var gscene = this.gun.get('scene');
            //check child keys var is object to put var
            function gunObjectAssign(_gun, _obj){
                for(var i in _obj){
                    if(typeof _obj[i] == 'object'){
                        console.log(i);
                        //pathing for object child of object
                        _gun.path(i).put(_obj[i]);
                        gunObjectAssign(_gun.path(i),_obj[i]);
                    }
                }
            }
            if(bfind){
                console.log("set object scene[update]");
                if(id !=null){
                    console.log(id);
                    gscene.path(id).put(obj);
                    gunObjectAssign(gscene.path(id),obj);
                }
            }else{
                console.log("save object scene[insert]");
                //console.log(obj);
                gscene.set(obj);
            }
            console.log("object save?");
        });

这里是获取对象。

function gunObjDataAssign(self,data){
                    for(var i in data){
                        if(typeof data[i] === 'object'){
                            if(data[i] !=null){
                                var id = data[i]['#'];
                                data[i] = {}; //clear id hash
                                self.get(id).val((objdata)=>{
                                    delete objdata._;
                                    data[i] = objdata;
                                    gunObjDataAssign(self,objdata);
                                });
                            }
                        }
                    }
                }

                Gun.chain.valueobj = function (cb, opt) {
                  return this.val(function (val, field) {
                      if(val !=null){
                          delete val._;
                      }
                      gunObjDataAssign(this,val);
                      cb.call(this, val, field);
                  }, opt);
                };

                Gun.chain.liveobj = function (cb, opt) {
                  return this.on(function (val, field) {
                    delete val._;
                    gunObjDataAssign(this,val);
                    cb.call(this, val, field);
                  }, opt);
                };

                Gun.chain.eachobj = function () {
                  var each = this.map();
                  return this.valueobj.apply(each, arguments);
                };

还没有完全测试。但是一旦推送到场景对象,它的工作方不会尝试检测任何更新。

使用片段中的示例代码。

4

1 回答 1

0

如果我正确理解你的问题......你可能想使用这个插件:

https://github.com/gundb/synchronous

gun.get('player').sync({}, {}, function(player){
  // player updated!
  console.log("Full object, not just pointers:", player);
})

还有https://github.com/gundb/onward为您提供文档上的差异和路径。

这有帮助吗?让我知道,我会根据需要修改答案。

于 2016-12-27T07:58:13.600 回答