2016-11-07 108 views
2

我試圖通過從零開始實施TodoMVC來學習中繼。 我可以查詢我的數據是這樣它運作良好:如何更新客戶端存儲中的連接元數據?

query { 
    allTodos(first: 100) { 
    totalCount 
    completedCount 
    edges { 
     node { 
     id 
     text 
     completed 
     } 
    } 
    } 
} 

我上心的totalCountcompletedCount元數據添加到從這裏連接:http://graphql.org/learn/pagination/#end-of-list-counts-and-connections
它在這個例子類似:https://github.com/graphql/swapi-graphql/blob/master/src/schema/index.js#L78

現在我正在寫一個突變,以改變其completed字段Todo給定其id。 我收集我將需要在突變有效載荷中返回新的completedCount,但我不確定如何實施getConfigs()以在客戶端存儲中更新此項。我沒有用於連接的id,對不對?我的模式設計是否存在缺陷?謝謝!

回答

0

假設您的突變返回viewer,則需要將viewer添加到您的fatQuerygetConfigs。我認爲this tutorial可能會有所幫助。以下是與您的任務相關的摘錄:

添加Todo更復雜。原因是我們需要更新 不僅是我們將創建的Todo對象的狀態,而且還有一個存儲它的連接 - Todos的計數將會改變, 以及Todo節點的列表在邊緣。

import Relay from 'react-relay'; 

export default class AddTodoMutation extends Relay.Mutation { 
    static fragments = { 
    viewer:() => Relay.QL`fragment on ReindexViewer { 
     id 
     allTodos { 
     count, 
     } 
    }` 
    }; 

    getMutation() { 
    return Relay.QL`mutation{ createTodo }`; 
    } 

    getVariables() { 
    return { 
     text: this.props.text, 
     complete: false, 
    }; 
    } 

    getFatQuery() { 
    return Relay.QL` 
     fragment on _TodoPayload { 
     changedTodoEdge, 
     viewer { 
      id, 
      allTodos { 
      count 
      } 
     } 
     } 
    `; 
    } 

    getConfigs() { 
    return [{ 
     type: 'RANGE_ADD', 
     parentID: this.props.viewer.id, 
     connectionName: 'allTodos', 
     edgeName: 'changedTodoEdge', 
     rangeBehaviors: { 
     '': 'prepend', 
     }, 
    }, { 
     type: 'FIELDS_CHANGE', 
     fieldIDs: { 
     viewer: this.props.viewer.id, 
     }, 
    }]; 
    } 

    getOptimisticResponse() { 
    return { 
     changedTodoEdge: { 
     node: { 
      text: this.props.text, 
      complete: false, 
     }, 
     }, 
     viewer: { 
     id: this.props.viewer.id, 
     allTodos: { 
      count: this.props.viewer.allTodos.count + 1, 
     }, 
     }, 
    }; 
    } 
} 

爲了執行這一突變,我們需要一些數據可能不是 提供給組件 - allTodos連接的觀衆對象的ID和計數。因此,我們需要爲我們爲容器指定它們的方式指定 突變的片段。

我們的配置也更復雜 - 我們需要將新的 Todo添加到連接,因此我們使用RANGE_ADD突變配置。繼電器 預計在有效載荷中傳遞邊緣,而不僅僅是Todo,Reindex 爲此提供了changedTodoEdge。最後,我們需要從服務器獲取更新的連接計數 ,並且對於此查看器字段,每個有效負載均可用 。

在我們的樂觀更新中,我們增加了allTodos的數量,以便 我們無任何延遲地改變我們的「總計」顯示。