片段“F1”不能在这里传播,因为“节点”类型的对象永远不能是“商店”类型

Posted

技术标签:

【中文标题】片段“F1”不能在这里传播,因为“节点”类型的对象永远不能是“商店”类型【英文标题】:Fragment "F1" cannot be spread here as objects of type "Node" can never be of type "Store" 【发布时间】:2017-07-21 23:48:33 【问题描述】:

我写了下面的代码:

在某些用户操作上调用以下方法:

handleFolderClicked = (topic, parent) => 
    console.log('Main : handleFolderClicked called : ', parent);
    this.props.relay.setVariables(
      parentFolder: parent,
      email: loginEmail
    );
  

Main = Relay.createContainer(Main, 
  initialVariables: 
    pageSize: pageSize,
    email: loginEmail,
    parentFolder: parentFolder,
  ,
  fragments: 
    store: () => Relay.QL`
      fragment on Store 
        id,
        fileConnection(first:999, email:$email, parentFolder:$parentFolder) 
          $DirectoryListing.getFragment('files'),
        
        users 
          email,
        
      
    `,
  
);
export default Main;

在页面加载时它工作正常并获取结果,但是当使用 setVariables 更改 parentFolder 的值时,它会抛出上述错误。

洞察力可能有用且值得赞赏。谢谢

【问题讨论】:

【参考方案1】:

我遇到了这个错误,我用这样的方法解决了:

Store必须实现Relay的Node接口,也就是说它必须提供一个id: ID!字段,如果你使用返回的ID进行节点查询,你的Store必须被返回。

在我的例子中,我将我的根对象命名为viewer,类型为Viewer;所以在实现Node 接口之后,这个查询必须工作:


  viewer 
    id
  

返回:


  "data": 
    "viewer": 
      "id": "Vmlld2VyOk5vbmU="
    
  

现在,如果我使用该 ID 运行节点查询,则必须返回查看器。所以对于查询:


  node(id: "Vmlld2VyOk5vbmU=") 
    id,
    __typename
  

这应该是结果:


  "data": 
    "node": 
      "id": "Vmlld2VyOk5vbmU=",
      "__typename": "Viewer"
    
  

将所有出现的viewer/Viewer 替换为store/Store,它应该可以工作。

【讨论】:

以上是关于片段“F1”不能在这里传播,因为“节点”类型的对象永远不能是“商店”类型的主要内容,如果未能解决你的问题,请参考以下文章

旋转时保留Fragment对象

每层多个节点的反向传播

深入理解DOM节点类型第四篇——文档片段节点DocumentFragment

事件的故事说明

TVirtualStringTree。如何通过一次确认检查节点及其子节点?

片段存储和重用:使用TabView的多个子片段