2015-09-14 103 views
4

支持當你定義的字段爲兩種類型的工會(在例如機載船舶和Droid),那麼在繼電器,你可以做這樣的事情:聯盟類型繼電器

fragment on [email protected] relay(plural: true) { 
    name, 
    machines { 
    ... on Ship { 
     name 
    } 
    ... on Droid { 
     name, 
     primaryFunction 
    } 
    } 
} 

所以在機器支撐你的對象是正確的評估,但如果你想這樣做,使用碎片從外部組件:

fragment on [email protected] relay(plural: true) { 
    name, 
    machines { 
    ${StarWarsShip.getFragment('ship')} 
    ${StarWarsDroid.getFragment('droid')} 
    } 
} 

那麼你最終下機片段定義。它看起來像你被困,並且無法檢查哪個對象是機器數組中的哪個類型,所以你不能決定應該使用哪個組件。

+0

https://github.com /臉書/繼電器/問題/ 268 – jzalucki

回答

8

存在一個__typename場與您應該能夠反思每一個記錄類型:

查詢

fragment on Faction @relay(plural: true) { 
    name, 
    machines { 
    __typename # <-- add this 
    ${StarWarsShip.getFragment('ship')} 
    ${StarWarsDroid.getFragment('droid')} 
    } 
} 

應用程序代碼

this.props.faction.machines.map(machine => 
    machine.__typename === 'Droid' 
    ? <Droid droid={machine} /> 
    : <Ship ship={machine} /> 
); 
+0

...截至https://github.com/facebook/relay/commit/ea2f5faae753526e1a76e70b05d262c4b2662570 – steveluscher

+0

我遇到這個問題,當我嘗試像你寫的那樣做: 未捕獲的錯誤:GraphQL驗證/轉換錯誤類型未定義沒有字段__typename。 –

+0

什麼版本的Relay,以及您正在運行的Babel Relay插件的版本是什麼? – steveluscher