{"id":455,"date":"2018-01-24T17:42:14","date_gmt":"2018-01-24T09:42:14","guid":{"rendered":"https:\/\/colliot.me\/?p=455"},"modified":"2018-01-26T11:59:37","modified_gmt":"2018-01-26T03:59:37","slug":"%e7%94%a8-angular-%e5%bc%84%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%8c%e5%8d%95%e8%af%8d%e7%9a%84%e7%bd%91%e7%ab%99-eliseos-org","status":"publish","type":"post","link":"https:\/\/colliot.org\/en\/2018\/01\/%e7%94%a8-angular-%e5%bc%84%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%8c%e5%8d%95%e8%af%8d%e7%9a%84%e7%bd%91%e7%ab%99-eliseos-org\/","title":{"rendered":"(\u4e2d\u6587) \u7528 Angular \u5f04\u4e86\u4e00\u4e2a\u80cc\u5355\u8bcd\u7684\u7f51\u7ad9\u2014\u2014eliseos.org"},"content":{"rendered":"<p class=\"qtranxs-available-languages-message qtranxs-available-languages-message-en\">Sorry, this entry is only available in <a href=\"https:\/\/colliot.org\/zh\/wp-json\/wp\/v2\/posts\/455\" class=\"qtranxs-available-language-link qtranxs-available-language-link-zh\" title=\"\u4e2d\u6587\">\u4e2d\u6587<\/a>. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.<\/p><p>\u5f04\u4e86\u4e00\u4e2a\u80cc\u5355\u8bcd\u7684\u7f51\u7ad9\u2014\u2014<a class=\" wrap external\" href=\"http:\/\/link.zhihu.com\/?target=https%3A\/\/www.eliseos.org\/zh\/home%3Freferral%3DHyAMJrVZG\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-za-detail-view-id=\"1043\">eliseos.org<\/a>\uff0c\u6216\u8005\u53eb\u00a0<a class=\" wrap external\" href=\"http:\/\/link.zhihu.com\/?target=https%3A\/\/jingtu.io\/zh\/home%3Freferral%3DHyAMJrVZG\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-za-detail-view-id=\"1043\">jingtu.io<\/a>\u3002\uff08\u8fd9\u4fe9\u540d\u5b57\u5176\u5b9e\u662f\u4e00\u4e2a\u610f\u601d\u3002\u5f53\u7136\u8fd9\u4e2a\u7f51\u7ad9\u4e0d\u4e3b\u8981\u662f\u4e3a\u4e86\u80cc\u5355\u8bcd\u800c\u5f00\u53d1\u7684\uff0c\u4e0d\u8fc7\u76ee\u524d\u53ea\u6709\u80cc\u5355\u8bcd\u7684\u8fd8\u80fd\u7528\u3002\uff09<\/p>\n<hr \/>\n<p>\u5b83\u662f Angular \u5f00\u53d1\u7684\uff0c\u540c\u65f6\u7528\u4e86\u4e00\u4e9b\u65f6\u65b0\u7684\u6280\u672f\uff0c\u6bd4\u5982\u524d\u7aef\u7684 redux-observable, graphql, apollo client\uff0c\u540e\u7aef\u7684 inversify, sequelize-typescript\uff0c\u53e6\u5916\u6211\u8fd8\u81ea\u5df1\u641e\u4e86\u4e00\u4e9b\u7528\u4e8e\u81ea\u52a8\u751f\u6210 graphql schema \u7684 decorator\u2014\u2014<\/p>\n<pre class=\"prettyprint lang-typescript\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">@Table\r\nexport class Language extends NoPrimaryOrdinaryModel&lt;Language&gt; {\r\n\r\n  @Default(DataType.UUIDV1)\r\n  @Column\r\n  @GraphQLFieldToType\r\n  id: string;\r\n\r\n  @PrimaryKey\r\n  @Column\r\n  @GraphQLFieldToType\r\n  name: string;\r\n\r\n  @GraphQLFieldJsonLike(() =&gt; Kv)\r\n  @Column(DataType.JSONB)\r\n  namesInLang: KvInterface;\r\n\r\n  @HasMany(() =&gt; LanguageOfLanguage, 'languageName')\r\n  languageOfLanguages: LanguageOfLanguage[];\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>\u662f\u4e0d\u662f\u6709\u70b9\u50cf Java \u4e86\uff1f\u8fd9\u4e48\u5199\u5c31\u4f1a\u751f\u6210\u4e00\u4e2a\u53eb Language \u7684\u8868\uff0c\u6709\u8fd9\u4e48\u4e9b column \u548c association\uff0c\u8fd9\u90e8\u5206\u662f sequelize-typescript \u7684\u529f\u80fd\uff0c\u8fd8\u4f1a\u751f\u6210\u4e00\u4e2a\u53eb Language \u7684 graphql schema\uff0c\u8fd9\u90e8\u5206\u662f\u6211\u81ea\u5df1\u5199\u7684\u3002\u96be\u4e5f\u4e0d\u96be\uff0c\u4e3b\u8981\u662f\u63d0\u4f9b\u4e00\u79cd\u601d\u8def\u3002<\/p>\n<p>\u53e6\u5916\u5199\u7684\u8fc7\u7a0b\u4e2d\u6211\u4e5f\u7406\u89e3\u4e86\u4e3a\u4ec0\u4e48 sequelize-typescript \u7684 decorator \u53c2\u6570\u91cc\uff0c\u7c7b\u578b\u662f lazy \u7684\uff08\u5373\u4ee5\u4e0a\u4ee3\u7801\u91cc\u7684 () =&gt; LanguageOfLanguage\u3002\u8fd9\u662f\u56e0\u4e3a\u5982\u679c\u4e0d lazy\uff0c\u51fa\u73b0\u7c7b\u7684\u5faa\u73af\u5f15\u7528\u7684\u65f6\u5019\uff0c\u6709\u4e00\u65b9\u4f1a\u53d8\u6210 undefined\u3002\u6211\u78b0\u5230\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u6240\u4ee5\u6211\u81ea\u5df1\u4e5f\u7528\u4e86 thunk \u5f62\u5f0f\u4f5c\u4e3a\u53c2\u6570\u3002<\/p>\n<p>\u7136\u540e\u5bf9\u4e8e query \u4e5f\u6709\u8fd9\u4e48\u4e9b\u4e2a decorator\uff0c\u6bd4\u5982\u2014\u2014<\/p>\n<pre class=\"prettyprint lang-typescript\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">@GraphQLQueryField(userGraphqlType, {\r\n  token: {\r\n    type: new GraphQLNonNull(GraphQLString)\r\n  }\r\n}, 'Checks if a token is valid. Returns the validated user.')\r\nasync checkToken(parentValue: any, {token}: {\r\n  token: string\r\n}, context: ContextInterface) {\r\n  return await context.services.userService.checkToken(token);\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>\u5176\u5b9e\u4e5f\u6ca1\u4ec0\u4e48\u5b66\u95ee\uff0c\u4e3b\u8981\u662f\u6211\u770b\u7740\u539f\u6765 graphql-js \u7684 object literal \u7ed3\u6784\u592a\u4e0d\u7a33\u5f53\u4e86\uff0c\u5d4c\u5957\u4e00\u6df1\uff0c\u968f\u4fbf\u54ea\u91cc\u7c7b\u578b\u5199\u9519\u4e86\uff0cTypeScript \u5c31\u629b\u4e00\u5927\u5806\u9519\uff08\u5176\u5b9e\u633a\u7a33\u5f53\u7684\uff0c\u53ea\u8981\u4f60\u628a object literal \u62c6\u5206\u5f00\u6765\uff0c\u6bcf\u4e00\u7ea7\u90fd\u6807\u6ce8\u7c7b\u578b\uff0c\u62a5\u9519\u5c31\u4e0d\u4f1a\u5927\u89c4\u6a21\u4f20\u64ad\uff09\u3002<\/p>\n<p>\u7528\u4e0a\u4e86 decorator\uff0c\u987a\u5e26\u7528\u4e86\u00a0<a class=\" wrap external\" href=\"http:\/\/link.zhihu.com\/?target=https%3A\/\/github.com\/inversify\/InversifyJS\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-za-detail-view-id=\"1043\">inversify<\/a>\u2014\u2014\u4e00\u4e2a\u4f9d\u8d56\u6ce8\u5165\u7ba1\u7406\u5668\uff0c\u4ee5\u53ca TypeScript \u7684\u4e00\u5957\u4e1c\u897f\uff0c\u8c01\u8bf4 Node.js \u4e0d\u53ef\u4ee5\u5de5\u7a0b\u5316\u5f00\u53d1\u5462\uff1f<\/p>\n<p>\u81f3\u4e8e\u524d\u7aef\uff0c\u4e5f\u662f\u4ece TypeScript \u4e2d\u83b7\u76ca\u826f\u591a\u3002Angular \u539f\u751f\u5c31\u662f\u4f9d\u8d56 TS \u7684\uff0c\u4e5f\u662f\u539f\u751f\u5c31\u4f9d\u8d56 decorator \u7684\uff0c\u4e5f\u662f\u539f\u751f\u5c31\u4f9d\u8d56\u6ce8\u5165\u7684\u3002\u8fd9\u4e48\u770b JS \u751f\u6001\u7cfb\u7edf\u524d\u540e\u7aef\u7684\u6280\u672f\u9009\u578b\u5df2\u7ecf\u8d8b\u540c\u4e86\uff0c\u6211\u76f8\u4fe1\u8fd9\u662f\u597d\u7684\u8d8b\u52bf\u3002<\/p>\n<p>\u8fd8\u6709\u4ec0\u4e48\u8981\u8bf4\u7684\u8bdd\uff0c\u5c31\u662f\u6211\u628a\u4ee5\u524d\u7b54\u8fc7\u7684<a class=\"internal\" href=\"https:\/\/www.zhihu.com\/question\/47452733\/answer\/242947384\" data-za-detail-view-id=\"1043\">Axurez\uff1a\u5982\u4f55\u8bc4\u4ef7 TypeScript \u6700\u65b0\u52a0\u5165\u7684 Discriminated union type\uff1f<\/a>\u8fd9\u4e2a\u5b9a\u4e49 tagged union \u7684\u7b80\u4fbf\u8bed\u6cd5\uff0c\u771f\u7684\u7ed9\u7528\u5230\u4e86\u5b9e\u6218\u91cc\u2014\u2014\u4e0d\u4ec5\u4ec5\u662f\u5b9a\u4e49 redux actions\uff0c\u800c\u4e14\u6211\u5199\u4e86\u4e00\u4e2a\u53ef\u4ee5\u6df1\u5ea6 get \u548c set \u7684 Map\uff0c\u56e0\u4e3a\u8981\u7528\u9012\u5f52\u6307\u6d89\u81ea\u8eab\uff0c\u8fd8\u5fc5\u987b\u7528\u5230 tagged union\u3002\u8fd9\u4e2a\u7c7b\u578b\u5982\u4e0b\uff1a<\/p>\n<pre class=\"prettyprint lang-typescript\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">export type RecMap&lt;K, V&gt; = Map&lt;K, { type: 'V', value: V } | { type: 'M', map: RecMap&lt;K, V&gt; }&gt;;<\/pre>\n<p>&nbsp;<\/p>\n<p>\u6574\u4e2a\u5f04\u4e0b\u6765\u7684\u611f\u60f3\u5c31\u662f\uff0cAngular \u662f\u771f\u7684\u597d\u7528\uff0cAngular \u751f\u6001\u662f\u771f\u7684\u4e0d\u9519\uff0cuniversal \u5b8c\u5168\u6309\u5b98\u65b9\u8d70\u4e00\u904d\u5c31\u6d3b\u4e86\uff0c\u73b0\u5728\u7ebf\u4e0a\u8fd0\u884c\u7684\u7248\u672c\u5c31\u662f universal \u7684\uff0c\u53f3\u952e\u67e5\u770b\u6e90\u7801\u53ef\u4ee5\u770b\u5230\u662f\u6e32\u67d3\u597d\u7684\u9875\u9762\u53d1\u8fc7\u6765\u7684\u3002angular cli \u4e00\u8def\u53ef\u4ee5 generate \u5230\u5e95\uff0c\u57fa\u4e8e NgModule \u7684\u8def\u7531\u61d2\u52a0\u8f7d\u4e5f\u662f\u5f00\u7bb1\u5373\u7528\uff0c\u4e0d\u9700\u8981\u4efb\u4f55\u914d\u7f6e\uff0c\u975e\u5e38\u7f8e\u5999\u3002<\/p>\n<p>\u8fd8\u6709\u4e00\u70b9\u5c31\u662f\uff0c\u8fd8\u662f\u7eaf css \u5e93\u6bd4\u8f83\u7a33\u59a5\uff0c\u5e26 JS \u7684\u53cd\u800c\u4e0d\u884c\uff0c\u6211\u7528\u4e86 material design components \u548c material design lite\uff08\u56e0\u4e3a\u524d\u8005\u6ca1\u5b9e\u73b0 chip\u2026\u2026\uff09\uff0c\u8fd8\u662f\u628a js \u62c6\u4e86\u7528\u7684\u3002\u4e00\u65b9\u9762\u662f\u5b83\u5e26\u7684 JS \u4e0d\u4e00\u5b9a\u5408\u4f60\u7684\u610f\uff0c\u53e6\u4e00\u65b9\u9762\u662f\u5b83\u54ea\u6015\u662f\u7528\u4e86\u4f60\u7528\u7684\u6846\u67b6\uff0c\u5b83\u7684 API \u8bbe\u8ba1\u4e5f\u4e0d\u4e00\u5b9a\u5408\u4f60\u610f\uff08\u8fd9\u4e5f\u662f\u6211\u4e0d\u7528 Angular Material \u7684\u539f\u56e0\uff09\u3002\u53e6\u5916\u7528\u4e86 Angular \u8fd9\u6837\u7684\u6846\u67b6\uff0c\u5b83\u5c01\u88c5\u7684\u90a3\u70b9\u529f\u80fd\u4f60\u81ea\u5df1\u5c01\u88c5\u4e5f\u8981\u4e0d\u4e86\u591a\u4e45\u3002<\/p>\n<p>\u5982\u679c\u8bf4\u8fd8\u6709\u4e00\u70b9\u611f\u60f3\uff0c\u90a3\u5c31\u662f\u6211\u597d\u50cf\u6709\u70b9\u8fbe\u6210\u4ee5\u524d\u7684\u76ee\u6807\u4e86\u3002\u4ee5\u524d\u603b\u662f\u611f\u89c9 sequelize \u8981\u5199\u4e00\u5957\u5b9a\u4e49\uff0c\u8981\u5199\u4e00\u5957\u63a5\u53e3\uff0cgraphql \u8fd8\u8981\u5199\u4e00\u5957\u5b9a\u4e49\uff0c\u6765\u6765\u56de\u56de\u540c\u6837\u7684\u4e1c\u897f\u8981\u5199\u597d\u591a\u904d\u3002\u73b0\u5728\u501f\u52a9 decorator \u771f\u7684\u5b9e\u73b0\u4e86\u53ea\u5199\u4e00\u904d\u3002\u73b0\u5728\u8fd8\u6709\u00a0<a class=\" wrap external\" href=\"http:\/\/link.zhihu.com\/?target=https%3A\/\/github.com\/flexxnn\/sequelize-auto-migrations\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-za-detail-view-id=\"1043\">sequelize-auto-migrations<\/a>\u00a0\u8fd9\u6837\u7684\u4e1c\u897f\uff0c\u53ef\u4ee5\u81ea\u52a8\u6839\u636e\u6a21\u578b\u7684\u66f4\u6539\u751f\u6210 migration\uff0c\u7b80\u76f4\u4e0d\u8981\u592a\u7701\u52b3\u52a8\u529b\u3002<\/p>\n<hr \/>\n<p>\u8bf4\u4e86\u8fd9\u4e48\u591a\u5173\u4e8e\u5f00\u53d1\u7684\u529f\u80fd\uff0c\u90a3\u4e48\u8fd9\u4e2a\u7f51\u7ad9\u600e\u4e48\u7528\u5462\uff1f\uff08\u63a8\u8350\u684c\u9762\u4f7f\u7528\uff0c\u867d\u7136\u79fb\u52a8\u7aef\u4e5f\u5b8c\u5168\u53ef\u7528\uff09<\/p>\n<p>\u5173\u4e8e\u80cc\u5355\u8bcd\u529f\u80fd\uff0c\u5982\u4e0b\u56fe\uff0c\u70b9\u51fb\u53f3\u4fa7\u7684\u300c\u5df4\u522b\u300d\uff08\u5df4\u522b\uff0c\u7528 wikipedia \u7684\u4eba\u5e94\u8be5\u89c1\u8fc7\uff0c\u5178\u51fa\u5df4\u522b\u5854\uff0c\u6211\u7528\u6765\u6307\u4ee3\u548c\u8bed\u8a00\u76f8\u5173\u7684\u6a21\u5757\uff09\u4e2d\u7684\u300c\u5b66\u4e60\u300d\uff0c\u5c31\u6765\u5230\u4e86\u5b66\u4e60\u754c\u9762\uff08\u540c\u65f6\u5728\u7ebf\u7edf\u8ba1\u662f\u7528\u00a0<a class=\" wrap external\" href=\"http:\/\/link.zhihu.com\/?target=http%3A\/\/socket.io\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-za-detail-view-id=\"1043\">socket.io<\/a>\u00a0\u5b9e\u73b0\u7684\uff0c\u4e0d\u8fc7\u7528\u6237\u6570\u91cf\u76ee\u524d\u5e76\u4e0d\u5bf9\uff0c\u9875\u9762\u662f\u5bf9\u7684\u3002\u8fd9\u91cc\u6709\u4e2a\u5f69\u86cb\uff0c\u6ca1\u7f51\u7684\u65f6\u5019 logo \u5c31\u4f1a\u9ed1\u6389\uff09\uff1a<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-458\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-f8c1d4ad7b8b1acfa838fdc5d4c52d24_b.jpg\" alt=\"\" width=\"543\" height=\"433\" \/><\/p>\n<figure><\/figure>\n<p>\u4f60\u53ef\u4ee5\u5728\u53f3\u4fa7\u7684\u300c\u8bed\u6599\u300d\u91cc\u7c98\u8d34\u8fdb\u82f1\u6587\u6587\u7ae0\uff0c\u7136\u540e\u70b9\u51fb\u300c\u4f7f\u7528\u8fd9\u7bc7\u6587\u7ae0\u300d\uff1a<\/p>\n<figure><img loading=\"lazy\" class=\"alignnone size-full wp-image-459\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-ced0001e7ab888081eaa054e2101141e_b.jpg\" alt=\"\" width=\"426\" height=\"560\" \/><\/figure>\n<p>\u5b83\u4f1a\u628a\u6587\u7ae0\u8ddf\u670d\u52a1\u5668\u540c\u6b65\uff0c\u89e3\u6790\u51fa\u4f60\u8ba4\u8bc6\u7684\u3001\u4e0d\u8ba4\u8bc6\u7684\u3001\u6ca1\u51b3\u5b9a\u8fc7\u7684\u8bcd\u6c47\uff0c\u5206\u522b\u6807\u4e0a\u767d\u8272\u3001\u7ea2\u8272\u548c\u7eff\u8272\uff1a<\/p>\n<figure><img loading=\"lazy\" class=\"alignnone size-full wp-image-460\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-eb667020f924cd869e67342eaa84a3f3_b.jpg\" alt=\"\" width=\"600\" height=\"282\" \/><\/figure>\n<p>\u6b63\u5982\u63d0\u793a\u6240\u8bf4\u7684<\/p>\n<blockquote><p>\u5728\u5de6\u8fb9\u7c98\u8d34\u6587\u7ae0\uff0c\u5e76\u70b9\u51fb\u6309\u94ae\uff0c\u6765\u63d0\u53d6\u6587\u7ae0\u4e2d\u7684\u5355\u8bcd\u3002<br \/>\n\u7eff\u8272\u8868\u793a\u72b6\u6001\u672a\u77e5\u7684\u5355\u8bcd\uff0c\u5212\u8fc7\u6807\u8bb0\u4e3a\u8ba4\u8bc6\uff0c\u5355\u51fb\u6807\u8bb0\u4e3a\u4e0d\u8ba4\u8bc6\uff0c\u518d\u5355\u51fb\u6807\u8bb0\u4e3a\u8ba4\u8bc6\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002<br \/>\n\u4f60\u53ef\u4ee5\u5728\u6982\u89c8\u4e2d\u56de\u987e\u4e0d\u8ba4\u8bc6\u7684\u5355\u8bcd\u3002<\/p><\/blockquote>\n<p>\u7167\u7740\u505a\u5c31\u884c\u4e86\u3002\u6211\u8fd8\u5f04\u4e86\u4e00\u4e2a\u529f\u80fd\u5c31\u662f\u6dfb\u52a0\u548c\u67e5\u770b\u5355\u8bcd\u91ca\u4e49\u3002\u628a\u9f20\u6807\u60ac\u505c\u5728\u4e0d\u8ba4\u8bc6\u7684\uff08\u5373\u7ea2\u7684\uff09\u5355\u8bcd\u4e0a\uff0c\u4f1a\u51fa\u73b0\u60ac\u6d6e\u6846\uff1a<\/p>\n<figure><img loading=\"lazy\" class=\"alignnone size-full wp-image-461\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-018dbf021fcb08494305d47f96eb8f68_b.jpg\" alt=\"\" width=\"445\" height=\"514\" \/><\/figure>\n<p>\u70b9\u51fb\u52a0\u53f7\u5c31\u4f1a\u51fa\u73b0\u6587\u672c\u6846\uff0c\u53ef\u4ee5\u6dfb\u52a0\u91ca\u4e49\uff0c\u4ee5\u53ca\u9009\u62e9\u91ca\u4e49\u7684\u8bed\u8a00\uff08\u8fd9\u4e2a\u7f51\u7ad9\u5904\u4e8e\u6211\u4e2a\u4eba\u7684\u6076\u8da3\u5473\uff0c\u662f\u652f\u6301\u4e86\u56db\u79cd\u8bed\u8a00\u7684\uff0c\u7528\u53f3\u4e0a\u89d2\u7684\u8bed\u8a00\u9009\u5355\u53ef\u4ee5\u6781\u901f\u5207\u6362\u8bed\u8a00\uff09\u3002\u6dfb\u52a0\u5b8c\u4e4b\u540e\uff0c\u6216\u8005\u672c\u6765\u5c31\u5df2\u7ecf\u6709\u4eba\u6dfb\u52a0\u8fc7\uff0c\u5c31\u4f1a\u662f\u8fd9\u4e2a\u6837\u5b50\uff1a<\/p>\n<figure><img loading=\"lazy\" class=\"alignnone size-full wp-image-462\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-70dfde94911a16117fff30eb6be9bef8_b.jpg\" alt=\"\" width=\"425\" height=\"181\" \/><\/figure>\n<p>\u672c\u6765\u5e94\u5f53\u662f\u53ef\u4ee5\u4ee3\u7406\u4e00\u4e2a\u5176\u4ed6\u7f51\u7ad9\u7684 API\uff0c\u6216\u8005\u5e72\u8106\u670d\u52a1\u5668\u4e0a\u641e\u4e00\u4e2a\u8bcd\u5e93\u7684\uff0c\u5b9e\u9645\u4e0a\u5e94\u8be5\u662f\u53ef\u884c\u7684\uff0c\u4f46\u6211\u8fd8\u662f\u60f3\u5148\u8bd5\u8bd5 UGC \u4e00\u6bb5\u65f6\u95f4\uff08\u4f30\u8ba1\u6548\u679c\u4e0d\u597d\uff09\u3002\u6dfb\u52a0\u91ca\u4e49\u7684\u53e6\u4e00\u4e2a\u597d\u5904\u5c31\u662f\u53ef\u4ee5\u5728\u4e2a\u4eba\u4e3b\u9875\u4e0a\u663e\u793a\u2026\u2026\u6bd4\u5982<a class=\" wrap external\" href=\"http:\/\/link.zhihu.com\/?target=https%3A\/\/www.eliseos.org\/zh\/community\/user\/Colliot\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-za-detail-view-id=\"1043\">\u6211\u7684\u4e3b\u9875<\/a>\uff1a<\/p>\n<figure><img loading=\"lazy\" class=\"alignnone size-full wp-image-463\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-3936b43e73bb9f16b8fb81d06acf756f_b.jpg\" alt=\"\" width=\"600\" height=\"407\" \/><\/figure>\n<p>\u4e2a\u4eba\u4e3b\u9875\u600e\u4e48\u8fdb\uff1f\u767b\u9646\u4e4b\u540e\u53f3\u4e0a\u89d2\u7684\u7528\u6237\u540d\u53ef\u4ee5\u76f4\u63a5\u70b9\u51fb\uff1a<\/p>\n<figure><img loading=\"lazy\" class=\"alignnone size-full wp-image-464\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-77856c0022197d1bbe7ca356292dc3aa_b.jpg\" alt=\"\" width=\"224\" height=\"75\" \/><\/figure>\n<p>\u6216\u8005\u9f20\u6807\u60ac\u505c\uff0c\u5728\u4e0b\u62c9\u83dc\u5355\u91cc\u9009\u300c\u4e2a\u4eba\u6863\u300d\u4e5f\u884c\u3002<\/p>\n<p>\u5982\u679c\u4f60\u8bef\u64cd\u4f5c\u4e86\uff0c\u4e00\u65b9\u9762\u4f60\u53ef\u4ee5\u518d\u6b21\u70b9\u51fb\u5355\u8bcd\uff0c\u5728\u767d\u8272\u548c\u7ea2\u8272\u4e4b\u95f4\u5207\u6362\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u53ef\u4ee5\u5728\u53f3\u4e0b\u89d2\u770b\u5230\u6240\u6709\u7ea2\u8272\u3001\u767d\u8272\u8bcd\u6c47\u7684\u5217\u8868\uff0c\u70b9\u51fb\u5c31\u53ef\u4ee5\u590d\u5f52\u300c\u672a\u786e\u8ba4\u300d\u72b6\u6001\uff0c\u5373\u7eff\u8272\u3002<\/p>\n<figure><img loading=\"lazy\" class=\"alignnone size-full wp-image-465\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-9d214849ba038652feb2d9d87622be6f_b.jpg\" alt=\"\" width=\"405\" height=\"334\" \/><\/figure>\n<p>\u786e\u8ba4\u5355\u8bcd\u4e3a\u672a\u77e5\u4e4b\u540e\uff0c\u4e0d\u4ec5\u5355\u8bcd\u4f1a\u88ab\u540c\u6b65\u5230\u670d\u52a1\u5668\uff0c\u5355\u8bcd\u6240\u5728\u7684\u53e5\u5b50\u4e5f\u4f1a\u88ab\u540c\u6b65\u5230\u670d\u52a1\u5668\uff0c\u5728\u53f3\u4fa7\u7684\u300c\u5df4\u522b\u2014\u6982\u89c8\u300d\u4e2d\u53ef\u4ee5\u56de\u770b\uff1a<\/p>\n<figure><img loading=\"lazy\" class=\"alignnone size-full wp-image-466\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-a1091d56deb488302dc4d80548fb17a6_b.jpg\" alt=\"\" width=\"600\" height=\"335\" \/><\/figure>\n<p>\u672a\u77e5\u5355\u8bcd\u5728\u53e5\u5b50\u4e2d\u7684\u672a\u77e5\u4e5f\u4f1a\u6807\u7ea2\u3002\uff08\u8fd9\u91cc\u672c\u6765\u662f\u7ed9\u5355\u8bcd\u52a0\u4e0a html \u6807\u7b7e\uff0c\u7136\u540e\u6e32\u67d3 html \u7684\uff0c\u4f46\u662f\u4f1a\u6709\u6ce8\u5165\u7684\u5371\u9669\uff0c\u6240\u4ee5\u6700\u540e\u5f3a\u884c\u628a\u53e5\u5b50 split \u6210\u4e00\u4e2a\u7ed3\u6784\u4f53\uff0c\u7528 ngFor + ngIf \u6e32\u67d3\u4e86\uff09<\/p>\n<p>\u4ee5\u4e0a\u5927\u6982\u5c31\u662f\u76ee\u524d\u80fd\u7528\u7684\u5185\u5bb9\u3002\u8bbe\u7f6e\u7684\u4e2a\u4eba\u6863\u4e5f\u53ef\u4ee5\u66f4\u65b0<\/p>\n<figure><img loading=\"lazy\" class=\"alignnone size-full wp-image-467\" src=\"https:\/\/colliot.me\/wp-content\/uploads\/2018\/01\/v2-6662064bb1060053279823ab6091919f_b.jpg\" alt=\"\" width=\"600\" height=\"300\" \/><\/figure>\n<p>\u8fd8\u53ef\u4ee5\u751f\u6210\u9080\u8bf7\u94fe\u63a5\uff0c\u63a8\u5e7f\u6ce8\u518c\u3002<\/p>\n<p>\u5982\u679c\u9047\u5230\u4ec0\u4e48 bug\uff0c\u8bf7\u4e00\u5b9a\u8054\u7cfb\u6211\u3002<\/p>\n<p>\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u8981\u505a\u8fd9\u4e2a\u7f51\u7ad9\uff1f\u8fd9\u4e2a\u7f51\u7ad9\u9664\u4e86\u80cc\u5355\u8bcd\u4e4b\u5916\uff0c\u8fd8\u662f\u5e72\u4ec0\u4e48\u7684\uff1f\u5c31\u5982<a class=\" wrap external\" href=\"http:\/\/link.zhihu.com\/?target=https%3A\/\/www.eliseos.org\/zh\/about\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-za-detail-view-id=\"1043\">\u5173\u4e8e<\/a>\u9875\u9762\u6240\u8bf4\uff1a<\/p>\n<hr \/>\n<p>Eliseos \u5c31\u662f\u300c\u6781\u4e50\u51c0\u571f\u300d\u7684\u897f\u73ed\u7259\u8bed\u5f62\u5f0f\u3002\u6211\u7528\u897f\u73ed\u7259\u8bed\u662f\u56e0\u4e3a\u5176\u4ed6\u8bed\u79cd\u7c7b\u4f3c\u7684\u57df\u540d\u90fd\u6ce8\u518c\u4e86\uff08elysium, elysian, elysion \u4e4b\u7c7b\u7684\uff09\u3002\u5176\u5b9e\u6211\u539f\u6765\u6709\u4e2a elysion.tech\uff0c\u4f46\u662f\u00a0<code>.tech<\/code>\u00a0\u592a\u51b7\u95e8\u4e86\uff0c\u5f88\u591a\u5730\u65b9\u8bc6\u522b\u4e0d\u51fa\u6765\u3002\u8fd9\u7f51\u7ad9\u8fd8\u6709\u4e2a\u57df\u540d\uff0c\u53eb\u300c\u51c0\u571f\u300d\u2014\u2014\u00a0<a class=\" wrap external\" href=\"http:\/\/link.zhihu.com\/?target=https%3A\/\/jingtu.io\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-za-detail-view-id=\"1043\">jingtu.io<\/a>\u3002<\/p>\n<p>\u6839\u636e\u7ef4\u57fa\u767e\u79d1\uff1a<\/p>\n<blockquote><p><i>\u81f3\u798f\u4e50\u571f\uff08Elysium\uff09\u6216\u662f\u4e50\u571f\u5e73\u539f\uff08Elysian Fields\uff09\uff08\u53e4\u5e0c\u814a\u8bed\uff1a\u1f28\u03bb\u03cd\u03c3\u03b9\u03bf\u03bd \u03c0\u03b5\u03b4\u03af\u03bf\u03bd\uff0c\u0112l\u00fdsion ped\u00edon\uff0c\u97f3\u8bd1\uff1a\u4f0a\u5229\u897f\u6069\u3001\u4f0a\u5229\u897f\u6602\u3002\u4e2d\u6587\u7ffb\u8bd1\u4e0a\u4ea6\u53ef\u540d\u4e3a\u5f52\u9759\u4e50\u571f\u6216\u662f\u5f52\u51c0\u4e50\u571f\uff0c\u610f\u4e3a\u56de\u5f52\u5b89\u9759\u6216\u56de\u5f52\u7eaf\u51c0\u7684\u4e50\u571f\u3002\uff09\u662f\u4e00\u4e2a\u6765\u4e16\u89c2\u7684\u7406\u5ff5\uff0c\u968f\u8457\u65f6\u95f4\u7684\u63a8\u79fb\u5e76\u7531\u4e00\u4e9b\u5e0c\u814a\u7684\u5b97\u6559\u6559\u6d3e\u7684\u4eea\u5f0f\u4e0e\u54f2\u5b66\u6d41\u6d3e\u6240\u5ef6\u7eed\u53d1\u5c55\u3002<\/i><\/p><\/blockquote>\n<p>\u6211\u6700\u65e9\u662f\u5728\u300a\u5723\u6597\u58eb\u661f\u77e2\u300b\u91cc\u63a5\u89e6\u5230\u8fd9\u6982\u5ff5\u7684\u3002\u5728\u8fd9\u91cc\uff0c\u6211\u60f3\u7528\u5b83\u6307\u4ee3\u8fd9\u4e2a\u7f51\u7ad9\uff0c\u662f\u56e0\u4e3a\u6211\u60f3\u505a\u4e00\u4e2a\u80fd\u8fdb\u884c\u6df1\u523b\u601d\u60f3\u4ea4\u6d41\uff08\u5305\u62ec\u8bed\u8a00\u3001\u77e5\u8bc6\uff09\u7684\u5730\u65b9\u3002<\/p>","protected":false},"excerpt":{"rendered":"<p>Sorry, this entry is only available in \u4e2d\u6587. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.\u5f04\u4e86\u4e00\u4e2a\u80cc\u5355\u8bcd\u7684\u7f51\u7ad9\u2014\u2014eliseos.org\uff0c\u6216\u8005\u53eb\u00a0jingtu.io\u3002\uff08\u8fd9\u4fe9\u540d\u5b57\u5176\u5b9e\u662f\u4e00\u4e2a\u610f\u601d\u3002\u5f53\u7136\u8fd9\u4e2a\u7f51\u7ad9\u4e0d\u4e3b\u8981\u662f\u4e3a\u4e86\u80cc\u5355\u8bcd\u800c\u5f00\u53d1\u7684\uff0c\u4e0d\u8fc7\u76ee\u524d\u53ea\u6709\u80cc\u5355\u8bcd\u7684\u8fd8\u80fd\u7528\u3002\uff09 \u5b83\u662f Angular \u5f00\u53d1\u7684\uff0c\u540c\u65f6\u7528\u4e86\u4e00\u4e9b\u65f6\u65b0\u7684\u6280\u672f\uff0c\u6bd4\u5982\u524d\u7aef\u7684 redux-observable, graphql, apollo client\uff0c\u540e\u7aef\u7684 inversify, sequelize-typescript\uff0c\u53e6\u5916\u6211\u8fd8\u81ea\u5df1\u641e\u4e86\u4e00\u4e9b\u7528\u4e8e\u81ea\u52a8\u751f\u6210 graphql schema \u7684 decorator\u2014\u2014 @Table export class Language extends NoPrimaryOrdinaryModel&lt;Language&gt; { @Default(DataType.UUIDV1) @Column &hellip; <a href=\"https:\/\/colliot.org\/en\/2018\/01\/%e7%94%a8-angular-%e5%bc%84%e4%ba%86%e4%b8%80%e4%b8%aa%e8%83%8c%e5%8d%95%e8%af%8d%e7%9a%84%e7%bd%91%e7%ab%99-eliseos-org\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;(\u4e2d\u6587) \u7528 Angular \u5f04\u4e86\u4e00\u4e2a\u80cc\u5355\u8bcd\u7684\u7f51\u7ad9\u2014\u2014eliseos.org&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16],"tags":[47,48],"_links":{"self":[{"href":"https:\/\/colliot.org\/en\/wp-json\/wp\/v2\/posts\/455"}],"collection":[{"href":"https:\/\/colliot.org\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/colliot.org\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/colliot.org\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/colliot.org\/en\/wp-json\/wp\/v2\/comments?post=455"}],"version-history":[{"count":0,"href":"https:\/\/colliot.org\/en\/wp-json\/wp\/v2\/posts\/455\/revisions"}],"wp:attachment":[{"href":"https:\/\/colliot.org\/en\/wp-json\/wp\/v2\/media?parent=455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/colliot.org\/en\/wp-json\/wp\/v2\/categories?post=455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/colliot.org\/en\/wp-json\/wp\/v2\/tags?post=455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}