代码之家  ›  专栏  ›  技术社区  ›  niko craft

在ajax发布后使用服务器中的值更新原始对象

  •  0
  • niko craft  · 技术社区  · 8 年前

    我调用服务器并保存一些内容,成功保存后,我需要用新值更新json数组对象。这是我的一些代码

    [
      {
        "id": 1,
        "uuid": "ce54acea-db20-4716-bceb-2f3deb1b2b86",
        "name": null,
        "order": 1,
        "children": []
      }
    ]
    

    我得到了一个对象数组,它们也可以相互嵌套。

    编辑特定对象后,我可以选择将新值保存到服务器。按下“保存”按钮后,在向服务器发送数据之前,我存储对正在编辑的对象的引用。我将此参考存储在

    selectNode = function(clickedNode) {
      this.selectedNode = clickedNode
      this.tempNode = _.clone(clickedNode)
    }
    

    我这里有一个temp对象,因为用户也可以按Cancel按钮,这意味着需要讨论任何更改。因此,我引用了正在编辑的对象,然后创建了tempNode对象,我实际编辑了该对象,并在保存时将其推送到服务器。

    我的问题是,成功保存后,我还想更新引用对象中的所有值。

    就在上面,我只有很少的值,但在我的应用程序中,每个节点都有很多值,所以我不想这样做

        this.http
            .put("/api/manage/v1/"+this.tempNode.uuid, this.tempNode)
            .map(res => res.json())
            .subscribe((data) => {
                this.selectedNode.name = this.tempNode.name
                this.selectedNode.order = this.tempNode.order
                ... and so on, this list could get long and not manageable after while
            }, (error) => {
                console.log(error)
            }
        );
    

    我还尝试在相同的位置执行此操作,将上述内容替换为

    this.selectedNode = _.merge({}, this.selectedNode, this.tempNode);
    

    但这会破坏引用并创建新对象,因此json数组中的原始对象永远不会更新,ofc也不会在屏幕上更新任何内容。

    有没有一种方法可以自动执行此操作

                this.selectedNode.name = this.tempNode.name
                this.selectedNode.order = this.tempNode.order
                this.selectedNode.etc= this.tempNode.etc
                this.selectedNode.etc= this.tempNode.etc7
    

    到一行代码,其中所有值都复制到引用的对象,而不使用新对象破坏引用?

    1 回复  |  直到 8 年前
        1
  •  1
  •   CertainPerformance    8 年前

    如果要保留参照,可以使用标准对象。assign可指定的所有属性 tempNode selectedNode 无需重新分配 选定的节点 :

    .subscribe((data) => {
      Object.assign(this.selectedNode, this.tempNode);
    

    对象assign(和_uu.merge,大概是)变异 第一个参数 ,你想要的是突变,而不是重新分配。