2016-09-13 16 views
0

私はリレー・コンテナを使用しません。なぜなら、コンポーネントをより詳細に制御したいからです。代わりに、私はHOC + Relay.Store.forceFetchを使用します。これは、任意のクエリを変数で取得します。だから私は、次のクエリを持っている:リレー突然変異フラグメント交差

query { 
    root { 
     search(filter: $filter) { 
     selectors { 
      _id, 
      data { 
      title, 
      status 
      } 
     }, 
     selectorGroups { 
      _id, 
      data { 
      title, 
      } 
     } 
     } 
    } 
} 

それから私はselectorタイプにいくつかの変異を行う必要があります。コンポーネントで

export default class ChangeStatusMutation extends Relay.Mutation { 
    getMutation() { 
    return Relay.QL`mutation {selectors_status_mutation}`; 
    } 
    getVariables() { 
    return { 
     id: this.props.id, 
     status: this.props.status 
    }; 
    } 
    getFatQuery() { 
    return Relay.QL` 
     fragment on selectors_status_mutationPayload{ 
     result { 
      data { 
      status 
      } 
     } 
     } 
    `; 
    } 
    static fragments = { 
    result:() => Relay.QL` 
     fragment on selector { 
     _id, 
     data { 
      title, 
      status 
     } 
     }`, 
    }; 

    getOptimisticResponse() { 
    return { 
     result: { 
     _id: this.props.id, 
     data: { 
      status: this.props.status 
     } 
     } 
    }; 
    } 

    getConfigs() { 
    return [{ 
     type: 'FIELDS_CHANGE', 
     fieldIDs: { 
     result: this.props.id 
     }, 
    }]; 
    } 
} 

コール変異:

const mutation = new ChangeStatusMutation({id, status, result: selector}); 
Relay.Store.commitUpdate(mutation); 

リレーストレージにおける突然変異のコミットメントセレクタは変更されません後。私はそれが原因で空Tracked Fragment Queryのだと思うと変異は任意のフィールドなしで実行します。

ChangeStatusMutation($input_0:selectors_statusInput!) { 
    selectors_status_mutation(input:$input_0) { 
    clientMutationId 
    } 
} 

しかし修飾セレクタはすでにリレーによってフェッチされ、そして私が小道具で突然変異にそれを渡しました。だから、Relayはタイプ、変更すべきもの、アイテムの見つけ方、およびどのフィールドを置き換えるべきかを知っています。しかし交差することはできません。どうしましたか?

答えて

1

だから、あなたはリレーコンテナを避けることによって、ここで間違いなく「牧場オフ」ビットだが、私はこれはまだ動作するはずだと思う...

リレーはあなたで示されたノードを検索することにより、クエリの交差点を行い、 FIELDS_CHANGE設定この場合、fieldIDsthis.props.idresultノードを指しています。

あなたの店舗にそのIDを持つノードがありますか?あなたのforceFetchクエリで、何か別のものを取って_idを取得したのに、実際にはidを取得していないことがわかりました。私はあなたがこのresultタイプにかかわらずフェッチするために送っているクエリを確認することから始めたい

リレーは...あなたは、後で再フェッチまたは上の宣言型変異のAPIを使用したい何でも上に存在することidフィールドが必要です。私はあなたが質問の説明のどこにでもそれを取り出すのを見ていないので、私はちょうどあなたがそれを今取っていないかもしれないと仮定していますか?

+0

私は多くのリレーの例でIDフィールドに出くわしましたが、それは必須であることはわかりませんでした(私は試してみます –

+0

'result'フィールドについては正確に同じように要求されていませんでした。しかし、 'result'の型は' selector'であり、セレクタは第一の大きなクエリ 'selectors {...'で要求されていましたので、正しい交差のためにフィールド名はまったく同じでなければなりません。 –

+0

交差は、フィールド名ではなくidに基づいています。そのため、あなたがそれを提供していることを確認する必要があります(そして、有効な既存のIDをfieldIDsに渡す必要があります) – NevilleS

関連する問題