2017-06-23 4 views
1

フラグメント構成を正しく動作させる方法を理解するのに苦労しています。私は必要な断片を含むルート<QueryRenderer />を持っています。フラグメントがマージされ、クエリが必要なすべてのデータを返すことがわかります。データは私のページにメインのレンダリングノードに渡されたが、これは、子ノードに渡されたときにリレーが文句をされていますRelay Modernのフラグメント構成を動作させるにはどうすればよいですか?

Warning: RelayModernSelector: Expected object to contain data for fragment `BoardControlsComponent_processMeta`, got `{"item": 1, "name": "Test"}`. Make sure that the parent operation/fragment included fragment `...BoardControlsComponent_processMeta`. 

コード

export let BoardContainer = createFragmentContainer(BoardComponent, { 
     processMeta: NavbarFragment.processMeta, 
}); 
export const Board = ({match}) => { 
     return (<QueryRenderer 
       environment={environment} 
       variables={{ 
        processId: match.params.processId, 
        boardType: match.params.boardType, 
        boardClass: match.params.boardClass 
       }} 
       query={BoardDataQuery} 
       render={({error, props}) => { 
        if (error) { 
         return <div>{error.message}</div>; 
        } else if (props) { 
         //console.log(props); 
         return (<BoardContainer {...props} match={match}/>); 
        } 
        return <ProgressBar active now={100} />; 
       }} 
      /> 


     ); 
}; 

をレンダリング()BoardComponentのでは:

<BoardControlsContainer processMeta={this.props.processMeta} /> 

BoardDataQuery

export const BoardDataQuery = graphql` 
        query BoardDataQuery($processId: Int!, $boardClass: String!, $boardType: String!) { 
         processMeta(processId: $processId, boardClass: $boardClass, boardType: $boardType) { 
          ...NavbarComponent_processMeta 
          ...BoardControlsComponent_processMeta 
         } 
        } 
       `; 

BoardControlsContainer

export const BoardControlsContainer = createFragmentContainer(BoardControlsComponent, { 
    processMeta: BoardControlsFragment.processMeta 
}); 

のでBoardDataQueryは、2つのコンポーネントのProcessMetaフィールドが含まれており、ブラウザでネットワークのデバッグコンソールをチェックすることが要求されるように、すべてのデータが戻って来て確認します。このデータをプロップとして渡すと、Relayは、オブジェクトが挿入されているのではなく、フラグメントを予期していると不満を持ちます。それだけでなく、渡される実際のオブジェクトには、指定された余分なフィールドがありません。

私はここで間違っていますか?

答えて

0

これは、Relayがどのようにフラグメントを構成するかについての私の誤解であることが判明しました。

まず、ターゲットコンポーネントが命名基準に従ってフラグメントを定義していない場合、Relayは内部オブジェクトのみを渡します。

第2に、データを使用するためにフラグメントがルートクエリに合成されても、各コンポーネントは独自のデータ要件を指定する必要があります。基本的には、BoardDataQueryに余分なフィールドを追加して、BoardContainerコンポーネントで使用できるようにする必要があります。

関連する問題