{ "version": "https://jsonfeed.org/version/1", "title": "Angular", "description": "Superheroic Javascript MVW Framework", "home_page_url": "go/angular", "feed_url": "feed/angular.json", "icon": "https://cdn.v2ex.com/navatar/96b9/bff0/814_large.png?m=1579006072", "favicon": "https://cdn.v2ex.com/navatar/96b9/bff0/814_normal.png?m=1579006072", "items": [ { "author": { "url": "member/insanny", "name": "insanny", "avatar": "https://cdn.v2ex.com/avatar/0b96/f319/629218_large.png?m=1684473226" }, "url": "t/1145133", "title": "\u5173\u4e8e\u5916\u90e8 js \u4fee\u6539 dx-select-box \u7684\u503c\u7684\u53ef\u884c\u6027", "id": "t/1145133", "date_published": "2025-07-14T10:53:57+00:00", "content_html": "\u8bf7\u95ee\u5bf9\u4e8e devExtreme \u4e2d\u7684 dx-select-box \uff0c\u6709\u6ca1\u6709\u65b9\u6cd5\u901a\u8fc7\u5916\u90e8 js \uff08\u5982\u6d4f\u89c8\u5668\u7684\u63a7\u5236\u53f0\u3001\u6d4f\u89c8\u5668\u63d2\u4ef6\u7b49\uff09\u76f4\u63a5\u4fee\u6539\u5b83\u7684 value \uff1f\u76ee\u524d\u4e86\u89e3\u5230\u7684\u65b9\u6848\u90fd\u662f
const selectBoxElement = document.querySelector('.dx-selectbox');
const dxSelectBoxInstance = $(selectBoxElement).data('dxSelectBox');
dxSelectBoxInstance.option('value', 'YourDesiredValue');
\u7136\u800c\u6211\u5728\u76ee\u6807\u7f51\u7ad9\u4e0a dxSelectBoxInstance \u8fd4\u56de\u7684\u662f Null
\u5e76\u4e14 ng.getComponent \u4e5f\u7528\u4e0d\u4e86\uff0cprobe \u8fd4\u56de\u7684\u4e5f\u662f\u7a7a\uff0c\u9875\u9762\u4e0a\u7684 html \u5143\u7d20\u76f4\u63a5\u663e\u793a\u7684\u5c31\u662f<dx-select-box>\uff0c\u5e76\u4e0d\u662f<div class='dx-selectbox'>" }, { "author": { "url": "member/drymonfidelia", "name": "drymonfidelia", "avatar": "https://cdn.v2ex.com/gravatar/017bcef6e642dbf067e17838a9cd447a?s=73&d=retro" }, "url": "t/1144132", "title": "2025 \u5e74 Angular SSR \u8fbe\u5230 Next.js \u7684\u6c34\u5e73\u4e86\u5417\uff1f\u8bb0\u5f97\u4e24\u4e09\u5e74\u524d\uff0c Angular \u81ea\u5df1\u7684\u5b98\u65b9\u6587\u6863 Google \u90fd\u53ea\u7d22\u5f15\u4e2a\u9996\u9875\uff0c\u73b0\u5728\u597d\u50cf\u6b63\u5e38\u6536\u5f55\u4e86", "id": "t/1144132", "date_published": "2025-07-09T19:55:43+00:00", "content_html": "" }, { "author": { "url": "member/wusheng0", "name": "wusheng0", "avatar": "https://cdn.v2ex.com/avatar/2c75/30bb/314309_large.png?m=1552810458" }, "url": "t/1044816", "title": "Angular \u8fd9\u4e48\u6ca1\u843d\u4e86\u5417", "id": "t/1044816", "date_published": "2024-05-28T11:12:22+00:00", "content_html": "

18 \u53d1\u5e03\u4e86\uff0c\u597d\u50cf\u4e5f\u6ca1\u6709\u8ba8\u8bba\u7684\u3002

\n

Angular.dev\n\u65b0\u6587\u6863\u7ad9\uff0c\u770b\u7740\u4e0d\u9519\u3002

\n

signals \u611f\u89c9\u4e0d\u5982 vue \u90a3\u79cd\u65b9\u4fbf\uff0c\u793a\u4f8b\u597d\u50cf\u4e5f\u6ca1\u63d0\u5230\u5305\u88f9\u5bf9\u8c61\u7684\u5b9e\u8df5\u3002

\n" }, { "author": { "url": "member/nzbin", "name": "nzbin", "avatar": "https://cdn.v2ex.com/avatar/293a/868b/277218_large.png?m=1719151770" }, "url": "t/1035762", "title": "ng-dnd 3.0 \u53d1\u5e03\u4e86\uff01\ud83c\udf89", "id": "t/1035762", "date_published": "2024-04-25T16:00:52+00:00", "content_html": "

https://github.com/ng-dnd/ng-dnd/releases/tag/v3.0.0

\n" }, { "author": { "url": "member/drymonfidelia", "name": "drymonfidelia", "avatar": "https://cdn.v2ex.com/gravatar/017bcef6e642dbf067e17838a9cd447a?s=73&d=retro" }, "url": "t/1033956", "title": "Angular \u9875\u9762\u8df3\u8f6c\u540e\u8fd4\u56de\u524d\u9875\u72b6\u6001\uff08\u8f93\u5165\u7684\u6570\u636e\uff09\u4e22\u5931\uff0c\u6709\u6ca1\u6709\u4ec0\u4e48\u7b80\u5355\u7684\u5305\u5f15\u5165\u540e\u5c31\u80fd\u50cf\u666e\u901a\u9875\u9762\u4e00\u6837\u8df3\u8f6c\u540e\u4fdd\u7559\u8f93\u5165\u6570\u636e\uff1f", "id": "t/1033956", "date_published": "2024-04-19T07:23:16+00:00", "content_html": "" }, { "author": { "url": "member/Mirachael", "name": "Mirachael", "avatar": "https://cdn.v2ex.com/avatar/5ff9/3dc1/88082_large.png?m=1715851151" }, "url": "t/1033320", "date_modified": "2024-04-17T08:32:40+00:00", "content_html": "

\u4f7f\u7528 computed \u83b7\u53d6\u6570\u7ec4\u957f\u5ea6\uff0c\u4f46\u662f\u89c6\u56fe\u4e0d\u4f1a\u66f4\u65b0

\n
 addrLength = computed(() => {\n const user = this.dataService.user();\n\n return user.addresses.length;\n });\n
\n

\u4f7f\u7528 computed \u91cd\u65b0\u6784\u5efa\u65b0\u7684\u6570\u7ec4\uff0c\u89c6\u56fe\u4e5f\u4e0d\u4f1a\u66f4\u65b0

\n
 addresses = computed(() => {\n const user = this.dataService.user();\n // transform data \u540e\u9875\u9762\u4e0d\u4f1a\u66f4\u65b0\n // return user.addresses.map(addr => ({ address: addr, title: `Address-${addr.title}` }));\n\n // \u76f4\u63a5\u8fd4\u56de user.addresses \uff0c\u9875\u9762\u4f1a\u66f4\u65b0\n return user.addresses;\n });\n
\n

\u8fd9\u91cc\u662f\u5728\u7ebf demo

\n", "date_published": "2024-04-17T08:31:59+00:00", "title": "\u8bf7\u6559\u4e0b angular computed \u76f8\u5173\u7684\u95ee\u9898", "id": "t/1033320" }, { "author": { "url": "member/tedding", "name": "tedding", "avatar": "https://cdn.v2ex.com/avatar/da47/ed44/434131_large.png?m=1712897559" }, "url": "t/1031949", "title": "\u5f00\u6e90\u590d\u523b\u4e86\u4e00\u4e2a Angular Canvas \u52a8\u6001\u80cc\u666f\u7ec4\u4ef6\u5e93\uff0c\u6b22\u8fce\u5927\u5bb6\u8bd5\u7528/PR [\u521b\u610f\u6765\u81ea\u672c\u7ad9/t/1020300]", "id": "t/1031949", "date_published": "2024-04-12T05:46:26+00:00", "content_html": "

\"Screenshot\"

\n

\u7a7a\u95f2\u65f6\u95f4\u4f7f\u7528 Angular \u590d\u523b\u4e86\u4e00\u4e0b uvcanvas \uff0c\u4eca\u5929\u53d1\u5e03\u4e86\u6700\u521d\u7684\u7248\u672c\uff5e\u3000(\u4e5f\u662f\u7b2c\u4e00\u6b21\u53d1\u5e03\u4e3b\u9898\u5e16\ud83d\ude33)

\n\n

\u9879\u76ee\uff1a https://github.com/teddingdev/ngx-uvcanvas
\n\u6587\u6863\uff1a https://ngx-uvcanvas.ife.app/

\n" }, { "author": { "url": "member/wjpauli", "name": "wjpauli", "avatar": "https://cdn.v2ex.com/avatar/5664/4a1b/489817_large.png?m=1712458755" }, "url": "t/1029872", "title": "\u6709\u4eba\u6210\u529f\u90e8\u7f72\u8fc7 Angular 17 SSR \u5230 AWS \u4e48\uff1f", "id": "t/1029872", "date_published": "2024-04-05T09:47:42+00:00", "content_html": "

\u6709\u4e00\u4e2a\u5c0f\u7f51\u7ad9\u9700\u8981 SEO \uff0c\u4f46\u662f\u53d1\u73b0 17 \u7684 SSR \uff0c\u6ca1\u6709\u4efb\u4f55\u90e8\u7f72\u7684\u6587\u6863\u3002\u770b\u5230 Angular \u90a3\u5e2e\u5b50\u4eba\u5929\u5929\u5728\u7f51\u4e0a\u6b4c\u821e\u5347\u5e73\u5c31\u6765\u6c14\u3002

\n
    \n
  1. \u901a\u8fc7 serverless \u90e8\u7f72\n\u641c\u4e86\u6700\u591a\u7684\u662f\u8fd9\u4e2a\uff0c\u4e5f\u662f\u4e2a\u7b2c\u4e09\u65b9\u516c\u53f8\u7684\u5e93\uff0c\u88c5\u5230 aws \u4e0a\uff0c\u7136\u540e\u627e\u5230\u7684\u6587\u6863\u90fd\u662f\u4ee5\u524d 16 \u7248\u7684\uff0c\u6ca1\u53d1\u7528\u3002
  2. \n
  3. \u901a\u8fc7 sst \u90e8\u7f72\n\u6709\u4e00\u4e2a\u7b2c\u4e09\u65b9\u7684\uff0c\u8fd9\u4e9b\u90fd\u5fcd\u4e86\u3002\u5e76\u4e14\u8fd9\u73a9\u610f\u672c\u8eab\u5c31\u4e0d\u652f\u6301 Angular \uff0c\u8dcc\u8dcc\u649e\u649e\u5f04\u597d\u4e86\uff0c\u7f51\u7ad9\u4e5f\u4e0a\u7ebf\u4e86\u3002\u4e5f\u53ef\u4ee5\u91cd\u590d\u90e8\u7f72\uff0c\u4f46\u662f\u8fc7\u4e86\u4e00\u6bb5\u65f6\u95f4\uff0c\u6628\u5929\u4fee\u6539\u4e00\u4e0b\uff0c\u518d\u90e8\u7f72\u5c31\u5931\u8d25\u4e86\uff0c\u771f\u662f\u65e0\u8bed\u3002\u4eca\u5929\u5f04\u4e86\u4e00\u5929\uff0c\u4e5f\u4e0d\u77e5\u9053\u662f\u7f51\u7edc\u95ee\u9898\u8fd8\u662f\u522b\u7684\u4ec0\u4e48\uff08\u6211\u7f51\u7edc\u6ca1\u95ee\u9898\uff09
  4. \n
\n

\u4e0a\u9762\u8fd9\u4e24\u4e2a\u90fd\u662f lambda \uff0c\u7136\u540e\u53c8\u5c1d\u8bd5\u4e86 ECS \u5bb9\u5668\uff0c\u4e5f\u53ef\u803b\u7684\u5931\u8d25\u9e1f\u3002\u6700\u4e3b\u8981\u7684\u662f angular \u6ca1\u6709\u63d0\u4f9b\u4efb\u4f55\u4e00\u4e01\u70b9\u7684\u90e8\u7f72\u6587\u6863\uff0c\u54ea\u4e9b\u88ab\u90e8\u7f72\u7684\u5730\u65b9\uff0c\u4e5f\u6ca1\u6709\u4efb\u4f55\u9884\u5236\u7684\u6a21\u677f\u3002

\n" }, { "author": { "url": "member/drymonfidelia", "name": "drymonfidelia", "avatar": "https://cdn.v2ex.com/gravatar/017bcef6e642dbf067e17838a9cd447a?s=73&d=retro" }, "url": "t/1015616", "date_modified": "2024-02-14T09:26:19+00:00", "content_html": "

\u63a5\u624b\u4e86\u4e00\u4e2a\u7f8e\u56fd\u540c\u4e8b\u5199\u7684\u8001\u5c4e\u5c71\uff0c\u9879\u76ee\u7ed3\u6784\u975e\u5e38\u590d\u6742\uff0c\u5230\u5904\u90fd\u662f {{accessdata|filterby:window['cache']['accessdata']}}\u8fd9\u79cd\u79bb\u8c31\u4ee3\u7801\uff0c\u542f\u7528 strictTemplates \u540e build \u76f4\u63a5\u62a5\u4e86 999+ \u4e2a\u9519\u8bef\u3002WebStorm \u5373\u4f7f\u4e0d\u5f00 strictTemplates \u4e5f\u80fd\u7528 Ctrl+B \u8df3\u8f6c\u5c5e\u6027\u5b9a\u4e49\u4f4d\u7f6e\uff0cVS Code \u7684 F12 \u53ea\u6709\u5728\u5f00\u542f strictTemplates \u624d\u80fd\u627e\u5230\u5b9a\u4e49\u3002\u6211\u719f\u6089\u7684\u5f88\u591a\u524d\u7aef\u6269\u5c55\u90fd\u5728 VS Code \u4e0a\uff0cv \u53cb\u6709\u529e\u6cd5\u89e3\u51b3\u5417\uff1f

\n", "date_published": "2024-02-14T09:24:37+00:00", "title": "vs code \u7684 angular \u6269\u5c55\u5982\u4f55\u5728\u5173\u95ed strictTemplates \u7684\u60c5\u51b5\u4e0b\u5f3a\u5236\u542f\u7528\u6a21\u677f\u5c5e\u6027\u8df3\u8f6c\uff1f", "id": "t/1015616" }, { "author": { "url": "member/wjpauli", "name": "wjpauli", "avatar": "https://cdn.v2ex.com/avatar/5664/4a1b/489817_large.png?m=1712458755" }, "url": "t/996532", "title": "\u88ab angular17 \u641e\u75af\u4e86", "id": "t/996532", "date_published": "2023-11-30T06:26:01+00:00", "content_html": "

\u8fd9\u662f\u4e00\u4e2a\u5927\u5347\u7ea7\uff0c\u4f46\u662f\u5bf9\u539f\u6765\u7684 16 \u7684\u9879\u76ee\u975e\u5e38\u4e0d\u53cb\u597d\uff0c\u6211\u5c1d\u8bd5 ng update \uff0c\u9047\u5230\u4e86\u5f88\u591a\u5947\u8469\u7684\u9519\u8bef\uff0c\u540e\u6765\u5e72\u8106\u91cd\u65b0 ng new app \uff0c\u5728\u91cd\u65b0\u590d\u5236\u4ee3\u7801\u3002\u7136\u540e\u53d1\u73b0\u4e86\u5f88\u591a\u53d8\u5316\uff1a

\n
    \n
  1. \n

    \u6211 NAS \u4e0a\u6620\u5c04\u7684\u9a71\u52a8\u5668\uff0c\u65e0\u6cd5\u4f7f\u7528\u4e86\u3002\u6bd4\u5982\u628a NAS \u7684\u8def\u5f84\u6620\u5c04\u4e3a W:\\\uff0c\u7136\u540e\u5728 W:\\\u4e0b\u521b\u5efa app \uff0c\u73b0\u5728\u521b\u5efa\u540e\u65e0\u6cd5\u6267\u884c\uff0c\u62a5\u9519\uff0c\u8fd9\u5bfc\u81f4\u65e0\u6cd5\u591a\u673a\u5f00\u53d1\u3002

    \n
  2. \n
  3. \n

    \u7ec4\u4ef6\u591a\u4e86\u4e00\u4e2a standalone: true \u7684\u6982\u5ff5\uff0c\u8fd9\u6837\u4ee5\u524d\u53ef\u4ee5\u76f4\u63a5\u7528\u7684\u7ec4\u4ef6\uff0c\u90fd\u9700\u8981\u6309\u9700 import \u4e00\u4e0b\uff0c\u5176\u5b9e\u8fd9\u6837\u633a\u597d\u7684\uff0c\u9632\u6b62\u4e0d\u5fc5\u8981\u7684\u52a0\u8f7d\uff0c\u4f46\u4ee3\u7801\u6539\u8d77\u6765\u7d2f\u6b7b\u4e86\uff0c\u5c24\u5176\u662f material.angular \u3002\u3002\u3002

    \n
  4. \n
  5. \n

    \u4ee5\u524d\u7684 app.module.ts \u4e0d\u89c1\u4e86\uff0c\u5f88\u591a\u90fd\u9700\u8981\u81ea\u5df1\u6539\u5730\u65b9

    \n
  6. \n
  7. \n

    and much more....

    \n
  8. \n
\n" }, { "author": { "url": "member/hedwi", "name": "hedwi", "avatar": "https://cdn.v2ex.com/avatar/cf5e/dc8a/515742_large.png?m=1709606295" }, "url": "t/990720", "title": "angular 17 \u53d1\u5e03", "id": "t/990720", "date_published": "2023-11-10T08:00:58+00:00", "content_html": "

https://blog.angular.io/introducing-angular-v17-4d7033312e4b

\n

https://www.youtube.com/watch?v=d0daPe9q35w

\n" }, { "author": { "url": "member/wjpauli", "name": "wjpauli", "avatar": "https://cdn.v2ex.com/avatar/5664/4a1b/489817_large.png?m=1712458755" }, "url": "t/968262", "title": "\u600e\u4e48\u4ed6\u55b5\u7684\u4f1a\u6709\u8fd9\u79cd\u4e8b", "id": "t/968262", "date_published": "2023-08-25T05:38:20+00:00", "content_html": "

\u90fd\u662f\u6700\u65b0\u7248\uff0c\u7528\u4e86 sass \u548c material \u3002\n\u6a21\u677f\u91cc\u8fd9\u6837\uff1a\n<mat-toolbar>\n\u6587\u5b57 1\n<button mat-button>\u6587\u5b57 2<button>\n</mat-toolbar>

\n

\u6b64\u65f6\u6587\u5b57 1 \u81ea\u52a8\u4f7f\u7528\u4e86 Material \u7684 Roboto \u5b57\u4f53\uff0c\u4f46\u662f\u5728\u6211\u7684 windows 10 \u53f0\u5f0f\u673a\u7684 chrome \u4e0b\uff0c\u6587\u5b57 2 \u5374\u4f7f\u7528\u4e86 Arial \u5b57\u4f53\u3002\u5728 Windows 11 \u7b14\u8bb0\u672c\u7684 chrome \u4e0b\uff0c\u6587\u5b57 2 \u4e5f\u4f7f\u7528\u4e86 Arial \u5b57\u4f53\uff0c\u4f46\u662f\u597d\u770b\u5f88\u591a\u3002

\n

\u628a sass \u6539\u6210\u8fd9\u6837\uff1a\nmat-toolbar\nbutton\ncolor: red\nfont-family: Roboto, \"Helvetica Neue\", sans-serif

\n

\u53d1\u73b0\u6587\u5b57 2 \u53d8\u6210\u4e86\u7ea2\u8272\uff0c\u5728 windows11 \u4e2d\u4e5f\u4f7f\u7528\u4e86 Roboto \u5b57\u4f53\uff0c\u4f46\u662f\u5728 windows10 \u4e2d\u5c45\u7136\u8fd8\u4fdd\u6301 Arial \u5b57\u4f53\u3002\u8bf7\u95ee\u8fd9\u662f\u4ec0\u4e48\u60c5\u51b5\uff1f

\n" }, { "author": { "url": "member/SupPerk", "name": "SupPerk", "avatar": "https://cdn.v2ex.com/gravatar/86830e7671a6bc81013bf60c9406b82a?s=73&d=retro" }, "url": "t/961073", "title": "\u8bf7\u95ee ngFor \u7684\u6570\u7ec4\u66f4\u65b0\u540e\uff0c\u5982\u4f55\u5728\u83b7\u77e5\u9875\u9762\u6e32\u67d3\u5df2\u5b8c\u6210\uff1f", "id": "t/961073", "date_published": "2023-07-30T21:07:35+00:00", "content_html": "

\u5982\u679c\u4e0d\u83b7\u53d6\u8fd9\u4e2a\u7ed3\u679c\uff0c\u800c\u76f4\u63a5\u5728\u540e\u53f0\u66f4\u65b0\u6570\u7ec4\uff0c\u5219\u540e\u9762\u6b65\u9aa4\u7684\u64cd\u4f5c\u4e0d\u4f1a\u751f\u6548\uff0c\u56e0\u4e3a\u6e32\u67d3\u662f\u5f02\u6b65\u7684

\n" }, { "author": { "url": "member/Char2s", "name": "Char2s", "avatar": "https://cdn.v2ex.com/avatar/2a5f/a571/556412_large.png?m=1682626275" }, "url": "t/959074", "date_modified": "2023-07-23T17:04:27+00:00", "content_html": "

\u7f8e\u56fd\u7f57\u5207\u65af\u7279\u7406\u5de5\u5927\u5b66 CS \u4e13\u4e1a\uff0cNode.js \u8f6f\u4ef6\u5de5\u7a0b\u5e08\uff0cWeb \u5f00\u53d1\u8005\u3002\u9879\u76ee\u7ecf\u9a8c\u4e30\u5bcc\uff0c\u5f00\u6e90\u793e\u533a\u6d3b\u8dc3\uff0c\u5f00\u53d1\u6709\u6570\u4e2a\u5f00\u6e90\u5e93\u548c\u5e94\u7528\uff0c\u6781\u5ea6\u6ce8\u91cd\u67b6\u6784\u8bbe\u8ba1\uff0c\u91cd\u89c6\u9879\u76ee\u8d28\u91cf\u3002\u81ea\u9ad8\u4e2d\u8d77\u5373\u79ef\u6781\u81ea\u5b66\u8f6f\u4ef6\u5f00\u53d1\uff0c\u56e0\u57fa\u7840\u624e\u5b9e\u70ed\u7231\u5f00\u6e90\uff0c\u9ad8\u4e2d\u671f\u95f4\u5728\u77e5\u4e4e\u5f97\u5230\u4e0d\u5c11\u5173\u6ce8\u3002

\n

\u5bb6\u5ead\u6761\u4ef6\u5e76\u4e0d\u597d\uff0c\u5bb6\u91cc\u4eba\u81ea\u4ece\u9ad8\u4e2d\u8d77\u5c31\u5f88\u652f\u6301\u6211\u8ba1\u7b97\u673a\u65b9\u9762\u7684\u5174\u8da3\uff0c\u7eb5\u4f7f\u4e4b\u540e\u53ef\u80fd\u5f97\u5356\u6389\u81ea\u5df1\u4f4f\u7684\u623f\u5b50\u4e5f\u575a\u6301\u627e\u4e2d\u4ecb\u9001\u6211\u53bb\u7f8e\u56fd\u6df1\u9020\u3002\u5728\u7f8e\u7684\u4e00\u4e2a\u5b66\u671f\u771f\u771f\u5207\u5207\u5730\u611f\u53d7\u5230\u7f8e\u56fd\u7684\u7269\u4ef7\u5bf9\u4e8e\u7559\u5b66\u751f\u6765\u8bf4\u6709\u591a\u8d35\uff0c\u51e0\u4e4e\u4e0d\u6562\u4e70\u4e1c\u897f\uff0c\u4f46\u82e6\u4e8e\u672a\u6210\u5e74\u5e76\u4e14\u7f8e\u56fd\u4e0d\u5141\u8bb8\u7b2c\u4e00\u5e74\u627e\u5b9e\u4e60\uff0c\u4e5f\u6682\u65f6\u6ca1\u627e\u5230\u9014\u5f84\u6253\u5c0f\u9ed1\u5de5\uff0c\u6ca1\u529e\u6cd5\u81ea\u5df1\u8d5a\u94b1\u3002

\n

\u4e0a\u4e2a\u6708\u521a\u8fc7\u5341\u516b\u5468\u5c81\u751f\u65e5\uff0c\u4f46\u76f4\u5230\u6700\u8fd1\u624d\u7a81\u7136\u610f\u8bc6\u5230\u53ef\u4ee5\u5728\u56fd\u5185\u627e\u5b9e\u4e60\u4e86\u3002\u3002\u7531\u4e8e Angular \u5728\u56fd\u5185\u5de5\u4f5c\u673a\u4f1a\u5e76\u4e0d\u591a\uff0c\u62db\u8058\u7f51\u7ad9\u4e0a\u5e76\u6ca1\u6709\u4ec0\u4e48\u5b9e\u4e60\u673a\u4f1a\uff0c\u4e8e\u662f\u6765\u8fd9\u91cc\u78b0\u78b0\u8fd0\u6c14\u3002

\n

\u7b80\u5386\uff08 OneDrive \uff09\uff1a https://1drv.ms/b/s!ArmN_DYQwMC8g-BEiie287s3b88WPA?e=waNeFu
\n\u8fd9\u4e2a\u94fe\u63a5\u91cc\u7684\u7b80\u5386\u91cc\u6709\u4e9b\u4fe1\u606f\u5220\u6389\u4e86\uff0c\u56e0\u4e3a\u4e0d\u662f\u5f88\u60f3\u5728\u516c\u5171\u573a\u5408\u900f\u9732\u592a\u591a\u4e2a\u4eba\u4fe1\u606f\u3002\u3002
\n\u8fd9\u4e5f\u662f\u6211\u7684\u7b2c\u4e00\u4efd\u6c42\u804c\u7b80\u5386\uff0c\u5982\u679c\u6709\u53d1\u73b0\u6709\u95ee\u9898\u9ebb\u70e6\u72e0\u72e0\u5730\u544a\u8bc9\u6211\uff01\u975e\u5e38\u611f\u8c22\uff01

\n

\u6709\u610f\u5411\u62db\u5b9e\u4e60\u751f\u7684\u8bf7\u72e0\u72e0\u5730\u8054\u7cfb\u6211\uff01\u5f00\u5b66\u671f\u95f4\u6211\u4e5f\u80fd\u5e72\u6d3b\uff01\uff01
\n\u90ae\u7bb1\uff1a char2s@outlook.com

\n", "date_published": "2023-07-23T16:57:20+00:00", "title": "\u5927\u4e00\u7559\u5b66\u751f\uff0c\u60f3\u627e\u4e00\u4efd Angular \u7684\u8fdc\u7a0b\u5b9e\u4e60\u8865\u8d34\u65e5\u5e38\u5f00\u9500", "id": "t/959074" }, { "author": { "url": "member/tsja", "name": "tsja", "avatar": "https://cdn.v2ex.com/avatar/b58f/4505/570178_large.png?m=1772093736" }, "url": "t/940818", "title": "\u65b0\u624b\u8bf7\u6559 Angular \u5b66\u4e60\u8bfe\u7a0b", "id": "t/940818", "date_published": "2023-05-17T14:03:40+00:00", "content_html": "

\u65b0\u624b\u8bf7\u6559 Angular \u5b66\u4e60\u8def\u7ebf\u4e0e\u8bfe\u7a0b

\n

\u672c\u4eba\u5f53\u524d\u5927\u4e09, \u627e\u5230\u4e00\u4e2a\u524d\u7aef\u5b9e\u4e60, \u516c\u53f8\u6280\u672f\u6808\u662f Angular. \u672c\u4eba\u6709\u4e00\u5b9a\u7684\u524d\u7aef\u57fa\u7840, Vue \u548c React \u90fd\u6bd4\u8f83\u719f\u6089, \u4f46\u662f\u4ece\u672a\u63a5\u89e6\u8fc7 Angular, \u8bf7\u95ee\u6709\u4ec0\u4e48\u63a8\u8350\u7684 Angular \u8bfe\u7a0b\u5417?

\n" }, { "author": { "url": "member/shakaraka", "name": "shakaraka", "avatar": "https://cdn.v2ex.com/avatar/de30/859d/190701_large.png?m=1749289695" }, "url": "t/937095", "date_modified": "2023-05-04T00:02:47+00:00", "content_html": "

Github V16.0.0

\n

\u5df2\u7ecf\u5c06 7 \u30018 \u4e2a\u9879\u76ee\u5347\u7ea7\u5b8c\u4e86\uff0c\u6709\u4e00\u4e2a ssr \u9879\u76ee\u7528\u4e86 Hydration \uff0c\u7ec8\u4e8e\u4e0d\u95ea\u5c4f\u4e86[\u6cea\u76ee]

\n

\u665a\u70b9\u73a9\u4f1a signal

\n", "date_published": "2023-05-04T00:01:22+00:00", "title": "[\u5f00\u5de5\u793c\u7269] \ud83e\udd73 Angular V16 \u53d1\u5e03\u5566", "id": "t/937095" }, { "author": { "url": "member/Char2s", "name": "Char2s", "avatar": "https://cdn.v2ex.com/avatar/2a5f/a571/556412_large.png?m=1682626275" }, "url": "t/936085", "title": "Angular \u65b0\u7eaa\u5143\uff1a Signals RFC", "id": "t/936085", "date_published": "2023-04-27T20:16:30+00:00", "content_html": "

Angular \u6bcf\u534a\u5e74\u63a8\u51fa\u4e00\u4e2a\u5927\u7248\u672c\uff0c\u4ee5\u4fdd\u6301\u6846\u67b6\u7684\u6301\u7eed\u66f4\u65b0\u3002\u7136\u800c\uff0c\u81ea\u4ece 2020 \u5e74\u521d Angular 9 \u63a8\u51fa\u91cd\u5927\u66f4\u65b0\u5e76\u5c06\u9ed8\u8ba4\u7f16\u8bd1\u548c\u6e32\u67d3\u5f15\u64ce\u4ece View Engine \u5207\u6362\u5230 Ivy \u540e\uff0cAngular \u7684\u8fed\u4ee3\u4f3c\u4e4e\u4e00\u76f4\u5904\u4e8e\u76f8\u5f53\u6d88\u6781\u7684\u72b6\u6001\u3002\u66f4\u65b0\u5185\u5bb9\u4e3b\u8981\u96c6\u4e2d\u5728\u8ddf\u8fdb TypeScript \u548c RxJS \u7248\u672c\u3001\u5c0f\u7279\u6027\u548c\u6027\u80fd\u4f18\u5316\u65b9\u9762\uff0c\u800c\u4e00\u4e9b\u9648\u5e74\u95ee\u9898\u4ecd\u672a\u89e3\u51b3\u3002

\n

\u6709\u4eba\u8ba4\u4e3a\u8fd9\u662f Angular \u7a33\u5b9a\u6210\u719f\u7684\u8868\u73b0\uff0c\u4e5f\u6709\u4eba\u8ba4\u4e3a\u8fd9\u662f Google \u653e\u5f03 Angular \u7684\u524d\u5146\u3002\u5728\u793e\u533a\u5185\u5145\u65a5\u7740\u5404\u79cd\u6d88\u6781\u60c5\u7eea\u65f6\uff0cAngular \u56e2\u961f\u5728\u4e00\u5e74\u65f6\u95f4\u5185\u63a5\u8fde\u63d0\u51fa\u4e86 Standalone APIs RFC \u548c Signals RFC \u8fd9\u4e24\u4e2a\u63d0\u6848\uff0c\u63a8\u51fa\u4e86\u5168\u65b0\u7684\u5e94\u7528\u7ec4\u7ec7\u65b9\u5f0f\u548c\u4e0e\u8fc7\u53bb\u5b8c\u5168\u4e0d\u540c\u7684\u57fa\u4e8e Signal \u7684\u54cd\u5e94\u6027\u548c\u6570\u636e\u6d41\u65b9\u6848\u3002Angular \u4f3c\u4e4e\u6b63\u5728\u6b65\u5165\u4e00\u4e2a\u65b0\u7684\u7eaa\u5143\u3002

\n

Signals RFC \u5206\u4e3a\u4e3b RFC \u548c\u56db\u4e2a\u5b50 RFC\uff1a

\n\n

\u672c\u6587\u5c06\u6982\u8ff0\u4e3b RFC \u548c\u6240\u6709\u5b50 RFC \u7684\u5185\u5bb9\uff0c\u4e0d\u5305\u542b\u7b14\u8005\u4e2a\u4eba\u89c2\u70b9\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u8fd9\u4e9b\u53ea\u662f\u8be5 RFC \u5f53\u524d\u9636\u6bb5\uff08 2023/04/12 \uff09\u7684\u5185\u5bb9\uff0cRFC \u53ef\u80fd\u968f\u65f6\u66f4\u65b0\uff0c\u6700\u7ec8\u7684\u5b9e\u73b0\u53ef\u80fd\u6709\u8f83\u5927\u51fa\u5165\u3002

\n

Signals RFC

\n

Signals RFC \u662f\u8fd1\u5e74\u6765 Angular \u56e2\u961f\u63d0\u51fa\u7684\u89c4\u6a21\u6700\u5927\uff0c\u4e5f\u6700\u5177\u98a0\u8986\u6027\u7684\u63d0\u6848\uff0c\u5176\u76ee\u6807\u662f\u89e3\u51b3\u6570\u4e2a\u5728\u793e\u533a\u4e2d\u7559\u5b58\u6570\u5e74\u7684\u95ee\u9898\uff0c\u5982\u57fa\u4e8e Zone.js \u7684\u53d8\u66f4\u68c0\u6d4b\u7684\u6027\u80fd\u95ee\u9898\uff0c\u57fa\u4e8e RxJS \u7684\u72b6\u6001\u6d3e\u751f\u8f83\u4e3a\u7e41\u7410\uff0c\u65e0\u6cd5\u4fbf\u6377\u5730\u5bf9\u7279\u5b9a Input \u7684\u53d8\u5316\u4f5c\u51fa\u54cd\u5e94\u7b49\u3002

\n

Angular \u56e2\u961f\u6839\u636e\u8fc7\u53bb\u51e0\u5e74\u7684\u793e\u533a\u53cd\u9988\u5236\u5b9a\u4e86\u4ee5\u4e0b\u76ee\u6807\uff1a

\n\n

\u800c Signals RFC \u5219\u88ab\u89c6\u4e3a\u662f\u5b9e\u73b0\u4ee5\u4e0a\u76ee\u6807\u7684\u57fa\u77f3\u3002

\n

Signal APIs

\n

Signal \u6307\u7684\u662f\u5177\u6709\u663e\u5f0f\u53d8\u5316\u8bed\u4e49\u7684\u503c\u3002\u5728 Angular \u4e2d\uff0cSignal \u662f\u7531\u8c03\u7528\u540e\u7acb\u5373\u8fd4\u56de\u5f53\u524d\u503c\u7684\u96f6\u53c2\u6570\u7684 Getter \u51fd\u6570\u8868\u793a\u7684\uff1a

\n
interface Signal<T> {\n (): T;\n [SIGNAL]: unknown;\n}\n
\n

\u8be5 Getter \u51fd\u6570\u5177\u6709\u4e00\u4e2a [SIGNAL] \u5c5e\u6027\uff0c\u6846\u67b6\u53ef\u4ee5\u7528\u8be5\u5c5e\u6027\u8fa8\u8bc6 signals \u4ee5\u7528\u4e8e\u5185\u90e8\u4f18\u5316\u3002

\n

Signal \u672c\u8d28\u4e0a\u5e94\u5f53\u662f\u53ea\u8bfb\u7684\uff0c\u53ea\u7528\u4e8e\u83b7\u53d6\u5f53\u524d\u7684\u503c\u4ee5\u53ca\u5bf9\u503c\u7684\u53d8\u66f4\u505a\u51fa\u54cd\u5e94\u3002

\n

Getter \u51fd\u6570\u7528\u4e8e\u8bbf\u95ee\u5f53\u524d\u503c\uff0c\u540c\u65f6\u5c06\u672c\u6b21 Signal \u7684\u8bfb\u53d6\u64cd\u4f5c\u8bb0\u5f55\u5728\u4e00\u4e2a Reactive Context \u4e2d\uff0c\u7528\u4e8e\u6784\u5efa\u54cd\u5e94\u5f0f\u4f9d\u8d56\u5173\u7cfb\u56fe\u3002

\n

\u5728 Reactive Context \u5916\u7684 Signal \u8bfb\u53d6\u4e5f\u662f\u88ab\u5141\u8bb8\u7684\u3002\u8fd9\u610f\u5473\u8005\u975e\u54cd\u5e94\u5f0f\u7684\u4ee3\u7801\uff0c\u5982\u7b2c\u4e09\u65b9\u5e93\u7684\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u8bfb\u53d6 Signal \u7684\u503c\uff0c\u800c\u65e0\u9700\u6ce8\u610f\u5176\u54cd\u5e94\u5f0f\u7684\u672c\u8d28\u3002

\n

Writable Signals

\n

Angular \u7684 Signal \u5e93\u63d0\u4f9b\u4e00\u4e2a\u9ed8\u8ba4\u7684 Writable Signal \u7684\u5b9e\u73b0\uff0c\u7528\u4e8e\u901a\u8fc7\u5176\u5185\u7f6e\u7684\u65b9\u6cd5\u53d8\u66f4 Signal \u7684\u503c\uff1a

\n
interface WritableSignal<T> extends Signal<T> {\n /**\n * \u5c06 Signal \u76f4\u63a5\u8bbe\u7f6e\u5230\u4e00\u4e2a\u65b0\u7684\u503c\u3002\n */\n set(value: T): void;\n /**\n * \u57fa\u4e8e Signal \u7684\u5f53\u524d\u503c\u4ee5\u5bf9\u503c\u8fdb\u884c\u66f4\u65b0\u3002\n */\n update(updateFn: (value: T) => T): void;\n /**\n * \u901a\u8fc7\u5bf9 Signal \u7684\u5f53\u524d\u503c\u8fdb\u884c\u76f4\u63a5\u7684\u53d8\u5316\u6765\u66f4\u65b0 Signal \u7684\u5f53\u524d\u503c\uff08\u4e0d\u6539\u53d8\u5bf9\u8c61\uff09\u3002\n */\n mutate(mutatorFn: (value: T) => void): void;\n /**\n * \u8fd4\u56de\u4e00\u4e2a\u975e Writable \u7684 Signal \uff0c\u8be5 Signal \u8bbf\u95ee\u5f53\u524d WritableSignal \u4f46\u4e0d\u5141\u8bb8\u5bf9\u503c\u8fdb\u884c\u53d8\u66f4\u3002\n */\n asReadonly(): Signal<T>;\n}\n
\n

\u901a\u8fc7 signal \u51fd\u6570\u53ef\u4ee5\u521b\u5efa WritableSignal \u7684\u5b9e\u4f8b\uff1a

\n
function signal<T>(\n initialValue: T,\n options?: {equal?: (a: T, b: T) => boolean}\n): WritableSignal<T>;\n
\n

\u7528\u6cd5\u793a\u4f8b\uff1a

\n
const counter = signal(0);\ncounter.set(5);\ncounter.update(currentValue => currentValue + 1);\n
\n

Equality

\n

\u53ef\u4ee5\u9009\u62e9\u6027\u7684\u4e3a WritableSignal \u6307\u5b9a\u4e00\u4e2a Equality \u6bd4\u8f83\u51fd\u6570\uff0c\u5982\u679c\u8be5 Equality \u51fd\u6570\u786e\u5b9a\u4e24\u4e2a\u503c\u662f\u76f8\u7b49\u7684\uff0c\u90a3\u4e48\uff1a

\n\n

\u9ed8\u8ba4\u7684 Equality \u51fd\u6570\u4f7f\u7528 === \u6765\u6bd4\u8f83\u57fa\u672c\u7c7b\u578b\u503c\uff0c\u4f46\u6bd4\u8f83\u5bf9\u8c61\u548c\u6570\u7ec4\u5c06\u4f1a\u6c38\u8fdc\u8fd4\u56de\u4e0d\u7b49\u3002\u8fd9\u5141\u8bb8 Signal \u6301\u6709\u975e\u57fa\u672c\u7c7b\u578b\u7684\u503c\u7684\u540c\u65f6\uff0c\u4ecd\u7136\u53ef\u4ee5\u4f20\u64ad\u5176\u503c\u7684\u53d8\u66f4\uff0c\u4f8b\u5982\uff1a

\n
const todos = signal<Todo[]>([{todo: 'Open RFC', done: true}]);\n// \u4e0d\u4f7f\u7528\u4e0d\u53ef\u53d8\u6570\u636e\u65f6\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u66f4\u65b0\u8be5\u5217\u8868\u5e76\u89e6\u53d1\u503c\u7684\u53d8\u66f4\u3002\ntodos.mutate(todosList => {\n todosList.push({todo: 'Respond to RFC comments', done: false});\n});\n
\n

Signal \u6982\u5ff5\u7684\u5176\u4ed6\u5b9e\u73b0\u662f\u53ef\u80fd\u7684\uff1a\u53ea\u8981\u5b9e\u73b0\u76f8\u5e94\u7684\u63a5\u53e3\uff0cAngular \u6216\u4efb\u4f55\u7b2c\u4e09\u65b9\u5e93\u90fd\u53ef\u4ee5\u521b\u5efa\u81ea\u5b9a\u4e49\u7684 Signal \u7248\u672c\u3002

\n

Getter \u51fd\u6570

\n

\u5728 Angular \u9009\u62e9\u7684\u8fd9\u4e00\u5b9e\u73b0\u4e2d\uff0cSignal \u662f\u7531\u4e00\u4e2a Getter \u51fd\u6570\u8868\u793a\u7684\u3002\u4f7f\u7528\u8fd9\u4e00 API \u7684\u4f18\u52bf\u6709\uff1a

\n\n

\u7136\u800c\uff0cGetter \u51fd\u6570\u4e5f\u6709\u8bf8\u591a\u5f0a\u75c5\uff1a

\n

\u5728\u6a21\u677f\u4e2d\u7684\u51fd\u6570\u8c03\u7528

\n

\u591a\u5e74\u6765\uff0cAngular \u5f00\u53d1\u8005\u5df2\u7ecf\u5b66\u4f1a\u4e86\u5bf9\u5728\u6a21\u677f\u4e2d\u8c03\u7528\u51fd\u6570\u4fdd\u6301\u8b66\u60d5\u3002\u5176\u51fa\u73b0\u7684\u539f\u56e0\u662f\u7ec4\u4ef6\u7684\u53d8\u66f4\u68c0\u6d4b\u8fd0\u884c\u9891\u7e41\uff0c\u800c\u51fd\u6570\u5219\u5f88\u6709\u53ef\u80fd\u9690\u85cf\u5177\u6709\u9ad8\u8ba1\u7b97\u6210\u672c\u7684\u903b\u8f91\u3002

\n

\u8fd9\u4e9b\u62c5\u5fe7\u5e76\u4e0d\u9002\u7528\u4e8e Signal \u7684 Getter \u51fd\u6570\u3002Getter \u51fd\u6570\u662f\u76f8\u5f53\u9ad8\u6548\u7684\u8bbf\u95ee\u5668\uff0c\u8ba1\u7b97\u6210\u672c\u6781\u4f4e\uff0c\u56e0\u6b64\u53cd\u590d\u9891\u7e41\u5730\u8c03\u7528 Signal \u7684 Getter \u51fd\u6570\u5e76\u4e0d\u662f\u4e00\u4e2a\u95ee\u9898\u3002

\n

\u7136\u800c\uff0c\u5728 Signal \u8bfb\u53d6\u4e2d\u4f7f\u7528\u51fd\u6570\u8c03\u7528\u4ecd\u7136\u53ef\u80fd\u5728\u4f1a\u5728\u521a\u5f00\u59cb\u65f6\u8ba9\u90a3\u4e9b\u4e60\u60ef\u4e8e\u5728\u6a21\u677f\u4e2d\u907f\u514d\u51fd\u6570\u8c03\u7528\u7684\u5f00\u53d1\u8005\u611f\u5230\u56f0\u60d1\u3002

\n

\u4e0e\u7c7b\u578b\u7f29\u7a84\u7684\u4ea4\u4e92

\n

TypeScript \u53ef\u4ee5\u5728\u6761\u4ef6\u8bed\u53e5\u4e2d\u7f29\u7a84\u4e00\u4e2a\u8868\u8fbe\u5f0f\u7684\u7c7b\u578b\u3002\u5373\u4f7f user.name \u53ef\u4ee5\u88ab\u8d4b\u503c\u4e3a null\uff0c\u4ee5\u4e0b\u4ee3\u7801\u4f9d\u7136\u53ef\u4ee5\u901a\u8fc7\u7c7b\u578b\u68c0\u6d4b\uff0c\u8fd9\u6b63\u662f\u56e0\u4e3a TypeScript \u77e5\u9053\u5728 if \u7684\u4e3b\u4f53\u4e2d\uff0c user.name \u4e0d\u53ef\u80fd\u662f null\uff1a

\n
if (user.name) {\n console.log(user.name.first);\n}\n
\n

\u7136\u800c\uff0cTypeScript \u5e76\u4e0d\u4f1a\u7f29\u7a84\u51fd\u6570\u8fd4\u56de\u503c\u7684\u7c7b\u578b\uff0c\u56e0\u4e3a\u5176\u4e0d\u80fd\u4fdd\u8bc1\u6bcf\u4e2a\u51fd\u6570\u90fd\u50cf Signal \u51fd\u6570\u8fd9\u6837\u6bcf\u6b21\u90fd\u4f1a\u8fd4\u56de\u76f8\u540c\u7684\u503c\u3002\u56e0\u6b64\uff0c\u4e0a\u9762\u7684\u793a\u4f8b\u5e76\u4e0d\u9002\u7528\u4e8e Signal\uff1a

\n
if (user.name()) {\n console.log(user.name().first); // \u7c7b\u578b\u9519\u8bef\n}\n
\n

\u5bf9\u4e8e\u8fd9\u4e2a\u7b80\u5355\u7684\u793a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u5f88\u7b80\u5355\u5730\u5c06 user.name() \u63d0\u53d6\u4e3a\u4e00\u4e2a\u5728 if \u8bed\u53e5\u5916\u7684\u5e38\u91cf\uff1a

\n
const name = user.name();\nif (name) {\n console.log(name.first);\n}\n
\n

\u7136\u800c\u5728\u6a21\u677f\u4e2d\uff0c\u7531\u4e8e\u65e0\u6cd5\u58f0\u660e\u4e2d\u95f4\u53d8\u91cf\uff0c\u8fd9\u79cd\u65b9\u5f0f\u5c06\u4e0d\u5728\u594f\u6548\u3002\u76ee\u524d\u53ea\u80fd\u4f9d\u8d56\u4e00\u4e9b Workaround \u6765\u89e3\u51b3\u8be5\u95ee\u9898\u3002

\n

\u66ff\u4ee3\u8bed\u6cd5

\n

Angular \u56e2\u961f\u8003\u8651\u4e86\u591a\u79cd Getter \u51fd\u6570\u7684\u66ff\u4ee3\u8bed\u6cd5\uff0c\u5305\u62ec Vue \u7684 .value \u8bed\u6cd5\uff0cReact \u7684 [value, setValue] \u8bed\u6cd5\uff0cVue \u7684 Proxy \u54cd\u5e94\u6027\uff0c\u548c Marko/Svelte \u7684\u7f16\u8bd1\u65f6\u54cd\u5e94\u6027\u3002\u8be6\u89c1 RFC \u539f\u6587\u3002

\n

Computed Signals

\n

Computed Signal \u662f\u4ece\u4e00\u4e2a\u6216\u591a\u4e2a\u4f9d\u8d56\u503c\u6d3e\u751f\u51fa\u7684\u65b0\u7684\u503c\uff0c\u4f1a\u5728\u5176\u4f9d\u8d56\u7684\u503c\u53d8\u66f4\u65f6\u66f4\u65b0\u3002Computed Signal \u4e5f\u53ef\u4ee5\u4f9d\u8d56\u5176\u4ed6 Computed Signals \u3002

\n

\u793a\u4f8b\uff1a

\n
const counter = signal(0);\nconst isEven = computed(() => counter() % 2 === 0);\nconst color = computed(() => isEven() ? 'red' : 'blue');\n
\n

computed \u51fd\u6570\u7684\u7b7e\u540d\u662f\uff1a

\n
function computed<T>(\n computation: () => T,\n options?: {equal?: (a: T, b: T) => boolean}\n): Signal<T>;\n
\n

computed \u51fd\u6570\u7684\u53c2\u6570\u4e2d\uff0c\u540d\u4e3a compuatation \u7684\u51fd\u6570\u4e0d\u5e94\u8be5\u6709\u4efb\u4f55\u526f\u4f5c\u7528 \u2014\u2014 \u5bf9\u4efb\u4f55 Signal \u7684\u53d8\u66f4\u90fd\u5e94\u5f53\u88ab\u907f\u514d\u3002Angular \u7684 Signal \u5e93\u5c06\u4f1a\u68c0\u6d4b\u5728 computation \u51fd\u6570\u4e2d\u5bf9\u5176\u4ed6 Signal \u7684\u53d8\u66f4\u5e76\u629b\u51fa\u5f02\u5e38\u3002

\n

\u4e0e Writable Signal \u7c7b\u4f3c\uff0cComputed Signal \u540c\u6837\u53ef\u4ee5\u53ef\u9009\u5730\u6307\u5b9a\u4e00\u4e2a Equality \u51fd\u6570\uff0c\u7528\u4e8e\u5728\u4e24\u4e2a\u503c\u88ab\u786e\u5b9a\u4e3a\u76f8\u7b49\u65f6\u963b\u6b62\u66f4\u6df1\u5c42\u7684\u4f9d\u8d56\u94fe\u7684\u91cd\u65b0\u8ba1\u7b97\u3002

\n

\u793a\u4f8b\uff08\u9ed8\u8ba4\u7684 Equality \u51fd\u6570\uff09\uff1a

\n
const counter = signal(0);\n\nconst isEven = computed(() => counter() % 2 === 0);\n\nconst color = computed(() => isEven() ? 'red' : 'blue');\n\n// \u5f53\u5c06 counter \u8bbe\u7f6e\u5230\u4e00\u4e2a\u4e0d\u540c\u7684\u5947\u6570\u503c\u65f6\uff1a\n// - isEven \u5c06\u5fc5\u5b9a\u91cd\u65b0\u8ba1\u7b97\uff08\u5176\u4f9d\u8d56\u7684\u503c\u53d8\u66f4\u4e86\uff09\n// - color \u65e0\u9700\u91cd\u65b0\u8ba1\u7b97\uff08 isEven \u7684\u503c\u6ca1\u6709\u53d8\u5316\uff09\ncounter.set(2);\n
\n

Angular \u9009\u62e9\u7684\u7528\u4e8e\u5b9e\u73b0 Computed Signal \u7684\u7b97\u6cd5\u5bf9\u8ba1\u7b97\u7684\u65f6\u673a\u548c\u6b63\u786e\u6027\u5177\u6709\u5f3a\u6709\u529b\u7684\u4fdd\u8bc1\uff1a

\n\n

Computed Signal \u4e2d\u7684\u6761\u4ef6\u5206\u652f

\n

Computed Signal \u4f1a\u8ddf\u8e2a\u5728 computation \u51fd\u6570\u4e2d\u8bfb\u53d6\u4e86\u54ea\u4e9b Signal \uff0c\u4ee5\u4fbf\u77e5\u9053\u4f55\u65f6\u9700\u8981\u91cd\u65b0\u8ba1\u7b97\u3002\u8fd9\u4e2a\u4f9d\u8d56\u96c6\u662f\u52a8\u6001\u7684\uff0c\u5e76\u4e14\u4f1a\u968f\u7740\u6bcf\u6b21\u8ba1\u7b97\u81ea\u6211\u8c03\u6574\u3002\u56e0\u6b64\uff0c\u5728\u8be5\u6761\u4ef6\u8ba1\u7b97\u4e2d\uff1a

\n
const greeting = computed(() => showName() ? `Hello, ${name()}!` : 'Hello!');\n
\n

\u5982\u679c showName \u7684\u503c\u6539\u53d8\u4e86\uff0c greeting \u603b\u662f\u4f1a\u91cd\u65b0\u8ba1\u7b97\uff0c\u4f46\u5982\u679c showName \u7684\u503c\u4e3a false\uff0c\u90a3\u4e48 name \u5c31\u4e0d\u4f1a\u662f greeting \u7684\u4f9d\u8d56\uff0c\u5176\u503c\u7684\u53d8\u5316\u4e5f\u5c31\u4e0d\u4f1a\u5bfc\u81f4 greeting \u91cd\u65b0\u8ba1\u7b97\u3002

\n

Effect

\n

Effect \u662f\u5177\u6709\u526f\u4f5c\u7528\u7684\u64cd\u4f5c\u3002\u6bcf\u5f53\u5176\u4e2d\u8bfb\u53d6\u7684\u4efb\u4f55\u4e00\u4e2a Signal \u7684\u503c\u66f4\u6539\u65f6\uff0cEffect \u4f1a\u81ea\u52a8\u5b89\u6392\u91cd\u65b0\u8fd0\u884c\u3002

\n

\u58f0\u660e Effect \u7684\u57fa\u672c API \u7b7e\u540d\u5982\u4e0b\uff1a

\n
function effect(\n effectFn: (onCleanup: (fn: () => void) => void) => void,\n options?: CreateEffectOptions\n): EffectRef;\n
\n

\u7528\u6cd5\u793a\u4f8b\uff1a

\n
const firstName = signal('John');\nconst lastName = signal('Doe');\n\n// \u8fd9\u4e2a Effect \u4f1a\u5411\u63a7\u5236\u53f0\u8f93\u51fa firstName \u548c lastName \uff0c\u5e76\u4e14\u6bcf\u5f53\u4ed6\u4eec\u7684\u503c\u53d8\u66f4\u65f6\u90fd\u4f1a\u91cd\u65b0\u5411\u63a7\u5236\u53f0\u8f93\u51fa\u3002 \neffect(() => console.log(firstName(), lastName()));\n
\n

Effect \u5177\u6709\u591a\u79cd\u7528\u9014\uff0c\u5305\u62ec\uff1a

\n\n

Effect \u51fd\u6570\u53ef\u4ee5\u9009\u62e9\u6027\u5730\u6ce8\u518c\u4e00\u4e2a\u6e05\u7406\u51fd\u6570\u3002\u6e05\u7406\u51fd\u6570\u4f1a\u5728\u4e0b\u4e00\u6b21\u8fd0\u884c\u6539 Effect \u524d\u88ab\u6267\u884c\uff0c\u53ef\u4ee5\u7528\u4e8e\u201c\u53d6\u6d88\u201d\u4e0a\u4e00\u6b21\u8fd0\u884c Effect \u65f6\u9057\u7559\u7684\u5de5\u4f5c\u3002\u4f8b\u5982\uff1a

\n
effect((onCleanup) => {\n const countValue = this.count();\n\n let secsFromChange = 0;\n const id = setInterval(() => {\n console.log(\n `${countValue} \u5728 ${++secsFromChange} \u79d2\u5185\u6ca1\u6709\u53d8\u5316`\n );\n }, 1000);\n\n onCleanup(() => {\n console.log('\u6e05\u7406\u5e76\u91cd\u65b0\u5b89\u6392 Effect');\n clearInterval(id);\n });\n});\n
\n

Effect \u7684\u8fd0\u884c\u65f6\u673a

\n

\u5728 Angular Signal \u5e93\u4e2d\uff0cEffect \u603b\u4f1a\u5728\u66f4\u6539 Signal \u7684\u64cd\u4f5c\u5b8c\u6210\u540e\u8fd0\u884c\u3002

\n

\u9274\u4e8e Effect \u7528\u9014\u7684\u591a\u6837\u6027\uff0c\u53ef\u80fd\u5b58\u5728\u5404\u79cd\u4e0d\u540c\u7684\u8fd0\u884c\u65f6\u673a\u3002\u8fd9\u5c31\u662f\u5b9e\u9645\u7684 Effect \u8fd0\u884c\u65f6\u673a\u4e0d\u80fd\u88ab\u4fdd\u8bc1\uff0c\u5e76\u4e14 Angular \u53ef\u80fd\u4f1a\u9009\u62e9\u4e0d\u540c\u7b56\u7565\u7684\u539f\u56e0\u3002\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u4eba\u5458\u4e0d\u5e94\u4f9d\u8d56\u4e8e\u4efb\u4f55\u89c2\u5bdf\u5230\u7684\u6267\u884c\u65f6\u95f4\u3002\u552f\u4e00\u53ef\u4ee5\u4fdd\u8bc1\u7684\u662f\uff1a

\n\n

\u7ec8\u6b62 Effect

\n

\u6bcf\u5f53\u4e00\u4e2a Effect \u7684\u4f9d\u8d56\u9879\u7684\u503c\u53d8\u66f4\uff0c\u8be5 Effect \u90fd\u4f1a\u88ab\u5b89\u6392\u8fd0\u884c\u3002\u4ece\u8fd9\u4e2a\u89d2\u5ea6\u4e0a\u770b\uff0cEffect \u4f3c\u4e4e\u662f\u201c\u6c38\u751f\u201d\u7684\uff0c\u5176\u6c38\u8fdc\u51c6\u5907\u7740\u5bf9 Reactive Graph \u4e2d\u53d1\u751f\u7684\u53d8\u5316\u505a\u51fa\u54cd\u5e94\u3002\u8fd9\u6837\u7684\u65e0\u9650\u5bff\u547d\u663e\u7136\u4e0d\u662f\u6211\u4eec\u60f3\u8981\u7684\uff0c\u56e0\u4e3a Effect \u5e94\u5f53\u5728\u5e94\u7528\u7ed3\u675f\u6216\u662f\u5176\u4ed6 Lifespan Scope \u7ed3\u675f\u65f6\u88ab\u7ec8\u6b62\u3002

\n

Angular Effect \u7684\u9ed8\u8ba4\u5bff\u547d\u662f\u4e0e\u6846\u67b6\u4e2d\u7684 DestroyRef \u76f8\u5173\u8054\u7684\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cEffect \u4f1a\u5c1d\u8bd5\u6ce8\u5165\u5f53\u524d\u7684 DestroyRef \u5b9e\u4f8b\uff0c\u7136\u540e\u5728\u5176\u4e2d\u6ce8\u518c\u5176\u7ec8\u6b62\u51fd\u6570\u3002

\n

\u5bf9\u4e8e\u9700\u8981\u66f4\u8be6\u7ec6\u7684\u5bff\u547d\u63a7\u5236\u7684\u60c5\u666f\uff0c\u53ef\u4ee5\u5728\u521b\u5efa Effect \u65f6\u542f\u7528 manualCleanup \u9009\u9879\uff1a

\n
effect(() => {...}, {manualCleanup?: boolean});\n
\n

\u5f53\u8be5\u9009\u9879\u542f\u7528\u65f6\uff0c\u5373\u4f7f\u521b\u5efa\u8be5 Effect \u7684\u7ec4\u4ef6\u6216\u662f\u6307\u4ee4\u5df2\u88ab\u9500\u6bc1\uff0c\u8be5 Effect \u4e5f\u4e0d\u4f1a\u88ab\u7ec8\u6b62\u3002

\n

\u53ef\u4ee5\u4f7f\u7528\u521b\u5efa Effect \u65f6\u8fd4\u56de\u7684 EffectRef \u5b9e\u4f8b\u624b\u52a8\u7ec8\u6b62\u8be5 Effect\uff1a

\n
const effectRef = effect(() => {...});\neffectRef.destroy();\n
\n

\u5728 Effect \u4e2d\u66f4\u6539 Signal \u7684\u503c

\n

Angular \u56e2\u961f\u666e\u904d\u8ba4\u4e3a\u5728 Effect \u4e2d\u66f4\u6539 Signal \u7684\u503c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u9884\u6599\u5916\u7684\u8868\u73b0\uff08\u5982\u65e0\u9650\u5faa\u73af\uff09\u548c\u96be\u4ee5\u8ddf\u8e2a\u7684\u6570\u636e\u6d41\u3002\u56e0\u6b64\uff0c\u4efb\u4f55\u5c1d\u8bd5\u4ece Effect \u4e2d\u66f4\u6539 Signal \u7684\u503c\u7684\u64cd\u4f5c\u90fd\u4f1a\u5411\u63a7\u5236\u53f0\u8f93\u51fa\u4e00\u4e2a\u9519\u8bef\u5e76\u88ab\u963b\u6b62\u3002

\n

\u53ef\u4ee5\u901a\u8fc7\u5728\u521b\u5efa Effect \u65f6\u542f\u7528 allowSignalWrites \u9009\u9879\u6765\u8986\u5199\u8be5\u9ed8\u8ba4\u884c\u4e3a\uff0c\u5982\uff1a

\n
const counter = signal(0);\nconst isBig = signal(false);\n\neffect(() => {\n if (counter() > 5) {\n isBig.set(true);\n } else {\n isBig.set(false);\n } \n}, {allowSignalWrites: true});\n
\n

\u6ce8\u610f\uff0c\u4e00\u822c\u6765\u8bf4\u4f7f\u7528 Computed Signal \u662f\u4e00\u79cd\u66f4\u58f0\u660e\u5f0f\uff0c\u66f4\u76f4\u89c2\uff0c\u4e14\u66f4\u53ef\u9884\u6d4b\u7684\u540c\u6b65\u6570\u636e\u7684\u65b9\u5f0f\uff1a

\n
const counter = signal(0);\nconst isBig = computed(() => counter() > 5);\n
\n

\u57fa\u4e8e Signal \u7684\u7ec4\u4ef6

\n

\u5269\u4e0b\u4e00\u5927\u534a\u56e0\u957f\u5ea6\u9650\u5236\u642c\u4e0d\u8fc7\u6765\uff0c\u89c1\u77e5\u4e4e\u539f\u6587\uff1a https://www.zhihu.com/question/595093745/answer/2981152934

\n" }, { "author": { "url": "member/LLaMA", "name": "LLaMA", "avatar": "https://cdn.v2ex.com/gravatar/3c9cf5afd0285df55eaa81b8f43c1664?s=73&d=retro" }, "url": "t/929509", "title": "Angular \u5199\u7684\u7f51\u7ad9\u6700\u5feb\u5b9e\u73b0 I18n \u7684\u65b9\u6cd5\u662f\u4ec0\u4e48\uff0c\u53ea\u8981\u80fd\u5207\u6362\u4e2d\u82f1\u6587\u5c31\u884c\uff0c\u4e0d\u9700\u8981\u652f\u6301\u5176\u5b83\u8bed\u8a00", "id": "t/929509", "date_published": "2023-04-03T11:19:43+00:00", "content_html": "" }, { "author": { "url": "member/edis0n0", "name": "edis0n0", "avatar": "https://cdn.v2ex.com/gravatar/8acfb030e98c7c3f424344dfb6eb8512?s=73&d=retro" }, "url": "t/903043", "title": "\u73b0\u5728\u56fd\u5916\u6709\u54ea\u4e00\u4e2a\u5927\u4e00\u70b9\u7684\u7f51\u7ad9\u662f\u7528 Angular \u5199\u524d\u7aef\u7684\u5417\uff1f", "id": "t/903043", "date_published": "2022-12-16T12:29:55+00:00", "content_html": "gg \u641c\u4e86\u4e00\u4e0b angular \u7684\u6848\u4f8b\uff0c\u91cc\u9762\u8c8c\u4f3c\u5c31\u4e00\u4e2a t-mobile \u5b98\u7f51\u6211\u80fd\u770b\u51fa\u6765\u662f Angular \uff0c\u5176\u5b83\u57fa\u672c\u5168\u662f React \uff0c\u8fd8\u6709 1 \u4e2a Vue \u7684" }, { "author": { "url": "member/Char2s", "name": "Char2s", "avatar": "https://cdn.v2ex.com/avatar/2a5f/a571/556412_large.png?m=1682626275" }, "url": "t/897332", "date_modified": "2022-11-23T06:04:57+00:00", "content_html": "

\u95f2\u6765\u65e0\u4e8b\uff0c\u5c1d\u8bd5\u5b9e\u73b0\u4e86\u4e00\u4e0b Material Studies \u91cc\u7684\u8fd9\u4e2a\u53eb Reply \u7684\u8de8\u5e73\u53f0\u90ae\u4ef6\u5e94\u7528\uff0c\u76ee\u6807\u662f\u5c3d\u53ef\u80fd\u4fdd\u8bc1\u7528\u6237\u5728\u4efb\u4f55\u8bbe\u5907\u5c4f\u5e55\u4e0a\u90fd\u80fd\u5f97\u5230\u5ab2\u7f8e\u539f\u751f\u5e94\u7528\u7684\u7528\u6237\u4f53\u9a8c\uff0c\u82b1\u4e86\u5f88\u591a\u7cbe\u529b\u5728 Material Motion \u7684\u52a8\u753b\u6548\u679c\u4e0a\uff0c\u597d\u5728\u6700\u7ec8\u7684\u6548\u679c\u8fd8\u662f\u5f88\u4e0d\u9519\u7684\u3002

\n

\"Reply\n\"Reply

\n

\u4e0d\u5f97\u4e0d\u8bf4 Angular \u7684\u52a8\u753b\u5f15\u64ce\u662f\u771f\u7684\u5f88\u5f3a\u5927\uff0c\u4f46\u5373\u4fbf\u5982\u6b64\u6709\u4e9b\u52a8\u753b\u6548\u679c\u6bd4\u5982 Shared Element Transition \u548c Container Transform \u8fd8\u662f\u6ca1\u6cd5\u76f4\u63a5\u7528\u5185\u7f6e\u7684\u52a8\u753b\u5f15\u64ce\u5b9e\u73b0\u3002\u8fd9\u65b9\u9762\u7684\u52a8\u753b\u6548\u679c\u7684\u5b9e\u73b0\u65b9\u5f0f\u6211\u662f\u501f\u9274\u7684 React \u7684 Framer Motion \u91cc\u7684 Layout Projection \u6280\u672f\u3002Layout Projection \u7684\u53d1\u660e\u8005 Matt Perry \u5728\u51e0\u5e74\u524d\u6709\u8fc7\u4e00\u4e2a\u5173\u4e8e\u8fd9\u4e2a\u6280\u672f\u7684\u6f14\u8bb2\uff0c\u8fd8\u53d1\u5e03\u4e86\u4e00\u7bc7\u6280\u672f\u7ec6\u8282\u535a\u5ba2\uff0c\u4f46\u65e0\u5948\u73b0\u5728\u5df2\u7ecf\u6253\u4e0d\u5f00\u4e86\uff0c\u6b64\u5904\u591a\u4e8f taowen \u5728 GitHub Gists \u4e0a\u4f20\u7684\u535a\u5ba2\u526f\u672c \u6211\u624d\u5f97\u4ee5\u5728 Angular \u5b9e\u73b0 Layout Projection \u3002

\n

Links

\n\n

\u5982\u679c\u4f60\u5bf9\u8fd9\u4e2a\u9879\u76ee\u6709\u5174\u8da3\uff0c\u5e0c\u671b\u4f60\u53ef\u4ee5 star \u4e00\u4e0b\u9879\u76ee\u7684 GitHub \u4ed3\u5e93\uff0c\u5982\u679c\u53ef\u4ee5\u5206\u4eab\u7ed9\u4f60\u7684\u670b\u53cb\u5c31\u66f4\u597d\u4e86\uff01\u5982\u679c\u53ef\u4ee5 follow \u4e00\u4e0b\u6211\u90a3\u5c31\u66f4\u597d\u4e0a\u52a0\u597d\u4e86\uff01:D
\n\u9a6c\u4e0a\u8981\u51fa\u56fd\u8bfb\u5927\u5b66\u4e86\uff0c\u6211\u5e0c\u671b\u80fd\u7ed9\u6559\u6388\u7559\u4e0b\u4e00\u4e2a\u6df1\u523b\u7684\u7b2c\u4e00\u5370\u8c61\uff0c\u975e\u5e38\u611f\u8c22\uff01

\n

Design

\n
\n

Reply \u662f\u4e00\u4e2a\u90ae\u4ef6\u5ba2\u6237\u7aef\uff0c\u4f7f\u7528 Material Design \u7ec4\u4ef6\u548c Material \u4e3b\u9898\u5b9a\u5236\u6765\u521b\u5efa\u54c1\u724c\u4ea4\u6d41\u4f53\u9a8c\u3002

\n

\"Reply

\n

\"Reply

\n
\n", "date_published": "2022-11-23T06:02:58+00:00", "title": "Material Motion \u7684\u6700\u5b8c\u6574\u5b9e\u73b0 - Material Studies \u793a\u4f8b\u5e94\u7528 Reply \u7684 Angular \u5b9e\u73b0\u73b0\u5df2\u516c\u5f00", "id": "t/897332" }, { "author": { "url": "member/gzf6", "name": "gzf6", "avatar": "https://cdn.v2ex.com/avatar/b91f/ab00/215896_large.png?m=1692887842" }, "url": "t/896188", "title": "Angular 15 \u53d1\u5e03", "id": "t/896188", "date_published": "2022-11-18T05:11:47+00:00", "content_html": "https://blog.angular.io/angular-v15-is-now-available-df7be7f2f4c8

\u987a\u4fbf\u6700\u8fd1 nuxt3 \u4e5f\u53d1\u5e03\u4e86" }, { "author": { "url": "member/bzw875", "name": "bzw875", "avatar": "https://cdn.v2ex.com/avatar/022e/17ea/39164_large.png?m=1646214419" }, "url": "t/896158", "date_modified": "2022-11-18T03:08:56+00:00", "content_html": "

\u5728 segmentfault \u95ee\u4e86\u6ca1\u4eba\u56de\u7b54\nhttps://segmentfault.com/q/1010000042779634\n\u4ee3\u7801\u4f8b\u5b50\nhttps://stackblitz.com/edit/angular-gwyili?file=src%2Fapp%2Fapp.component.html

\n", "date_published": "2022-11-18T03:05:44+00:00", "title": "\u6709 angular \u5927\u795e\u5417\uff0c cdk-virtual-scroll-viewport \u548c formArray \u4e00\u8d77\u7528\u6eda\u52a8\u4e2d\u95f4\u987a\u5e8f\u4e71\u4e86", "id": "t/896158" }, { "author": { "url": "member/anonymous2351d00", "name": "anonymous2351d00", "avatar": "https://cdn.v2ex.com/gravatar/8cb65a0fef9be8f4c5cd6bcd3ddd2a61?s=73&d=retro" }, "url": "t/891532", "title": "\u95ee\uff1a\u6765\u4e2a\u7cbe\u901a Angular \u7684\u5927\u54e5\u5e2e\u5fd9\u770b\u4e00\u6bb5\u4ee3\u7801", "id": "t/891532", "date_published": "2022-10-31T09:48:55+00:00", "content_html": "
 codeRun(code: string): void {\n if (!this.viewState.source || !this.viewState.source.id) return;\n this.toolbarState.loading.run = true;\n this.toolbarState.enable.stop = true;\n this.viewTableState.loading = true;\n const param: ViewTestExecute = {\n sourceId: this.viewState.source.id,\n scriptType: 'SQL',\n size: this.toolbarState.limit.value,\n script: code,\n variables: [],\n columns: [],\n countTotal: true\n };\n this.dataProviderService\n .execute(param)\n .pipe(\n catchError(exception => {\n this.toolbarState.loading.run = false;\n this.toolbarState.enable.stop = false;\n this.viewTableState.loading = false;\n throw exception;\n })\n )\n .pipe(takeUntil(this.destroy$))\n .subscribe((result: QueryResult) => {\n this.viewState.execute = param\n this.toolbarState.loading.run = false;\n this.toolbarState.enable = {run: true, stop: false, save: true, setting: false, copy: false};\n this.viewTableState = {...result, loading: false};\n });\n }\n
\n

\u5982\u4e0a\u9762\u8fd9\u6bb5\u4ee3\u7801\uff0c\u56e0\u4e3a\u9875\u9762\u7684\u6807\u7b7e\u4f8b\u5982 <spin [spining]='xxxloading'></spin>\u8fd9\u6837\uff0c\u6709\u4e00\u4e2a\u52a0\u8f7d\u72b6\u6001\uff0c\u4f46\u662f\u7528

\n
this.loading = true\nthis.http.get().subscribe(xx=>this.loading=false)\n
\n

\u8fd9\u79cd\u6539\u53d8 loading \u72b6\u6001\u7684\u4ee3\u7801\uff0c\u611f\u89c9\u5f04\u5f97\u6211\u4ee3\u7801\u5f88\u4e0d\u5e72\u51c0\uff0c\u6709\u6ca1\u6709\u4ec0\u4e48\u65b9\u6cd5\u80fd\u5c3d\u91cf\u8ba9\u6539\u53d8\u9875\u9762\u72b6\u6001\u4ee3\u7801\u7cbe\u7b80\u4e9b\uff0c\u8ba9\u6211\u7684\u4ee3\u7801\u5e72\u51c0\u4e9b

\n" }, { "author": { "url": "member/Rocketer", "name": "Rocketer", "avatar": "https://cdn.v2ex.com/avatar/02a1/fcf0/527231_large.png?m=1610040538" }, "url": "t/880118", "title": "\u4e3a\u4ec0\u4e48 Angular \u7684\u4e00\u4e9b\u7ec4\u4ef6\u4ecd\u5728\u4f7f\u7528 Promise\uff1f", "id": "t/880118", "date_published": "2022-09-14T18:20:25+00:00", "content_html": "

Angular \u7684\u4e00\u4e9b\u7ec4\u4ef6\uff08\u6bd4\u5982Router\uff09\uff0c\u5176\u8fd4\u56de\u503c\u662f Promise \uff0c\u800c\u4e0d\u662f Angular \u91cc\u6700\u5e38\u7528\u7684 Observable \uff0c\u6709\u4eba\u77e5\u9053\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5417\uff1f

\n" }, { "author": { "url": "member/annnnn", "name": "annnnn", "avatar": "https://cdn.v2ex.com/gravatar/cec3e5612140d764fb8669bead16d71e?s=73&d=retro" }, "url": "t/871487", "title": "\u6709\u6ca1\u6709\u5927\u4f6c\u5199\u8fc7 angular \u52a8\u6001\u8868\u5355", "id": "t/871487", "date_published": "2022-08-08T10:04:18+00:00", "content_html": "

angular7 + ng-zorro,\u6839\u636e json/schema \u52a8\u6001\u521b\u5efa form \u8868\u5355

\n" }, { "author": { "url": "member/kururul", "name": "kururul", "avatar": "https://cdn.v2ex.com/gravatar/b6018df53cfc3d85b1ce96e5db781578?s=73&d=retro" }, "url": "t/862808", "title": "\u8bf7\u6559\u5173\u4e8e SSR \u7684\u95ee\u9898\u3002SSR \u6709\u53ef\u80fd\u9690\u85cf AngularJS \u5165\u53e3\u6587\u4ef6\u5417\uff1f", "id": "t/862808", "date_published": "2022-06-28T16:45:40+00:00", "content_html": "

\u6709\u4e00\u4e2a AngularJS(\u6ce8\u610f\u662f JS \uff0c\u4e5f\u5c31\u662f 1.x \u7248\u672c)\u5199\u7684\u8001\u9879\u76ee\uff0c\u73b0\u5728\u6709\u4e00\u4e2a\u65b0\u7684\u9700\u6c42\u3002\u51fa\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u8981\u6c42\u767b\u5f55\u4e4b\u524d\u6d4f\u89c8\u5668\u4e0d\u80fd\u83b7\u53d6\u5230\u4efb\u4f55\u767b\u5f55\u9875\u9762\u4ee5\u5916\u7684\u5185\u5bb9\u3002\u76ee\u524d\u9879\u76ee\u662f\u7528 Gulp \u6253\u5305\uff0c\u6240\u6709\u7684 template \u90fd\u88ab\u6253\u5305\u5728 Angular \u7684\u5165\u53e3\u6587\u4ef6\u91cc\uff0c\u7b49\u4e8e\u83b7\u53d6\u4e86\u8fd9\u4e2a JS \u6587\u4ef6\u5c31\u80fd\u5f97\u5230\u7edd\u5927\u90e8\u5206\u9875\u9762\u5185\u5bb9\u4e86\u3002

\n

\u8003\u8651\u4e86\u4e4b\u540e\u60f3\u8bf4 SSR \u80fd\u4e0d\u80fd\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u4e0d\u8fc7\u770b\u4e86 Express \u548c\u5176\u5b83\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u53ef\u80fd\u4e3b\u8981\u90fd\u662f\u9488\u5bf9 SEO \u8bbe\u8ba1\u7684\uff0c\u597d\u50cf\u5e76\u4e0d\u80fd\u628a Angular \u7684\u903b\u8f91\u5168\u653e\u5728\u670d\u52a1\u7aef\uff0c\u8ba9\u6d4f\u89c8\u5668\u53ea\u62ff\u5230 HTML \u3002

\n

\u6211\u524d\u7aef\u5b8c\u5168\u5c0f\u767d\uff0c\u60f3\u8bf7\u95ee\u5927\u5bb6\u6709\u6ca1\u6709\u4ec0\u4e48\u5efa\u8bae\uff1f SSR \u8fd9\u4e2a\u601d\u8def\u80fd\u884c\u5417\uff1f\u6709\u6ca1\u6709\u5176\u4ed6\u63a8\u8350\u7684\u65b9\u6cd5\uff1f\u5728\u8fd9\u63d0\u524d\u8c22\u8fc7

\n" }, { "author": { "url": "member/gzf6", "name": "gzf6", "avatar": "https://cdn.v2ex.com/avatar/b91f/ab00/215896_large.png?m=1692887842" }, "url": "t/858739", "title": "Angular 14 \u66f4\u65b0", "id": "t/858739", "date_published": "2022-06-10T07:54:32+00:00", "content_html": "https://blog.angular.io/angular-v14-is-now-available-391a6db736af

\u7c7b\u578b\u8868\u5355\u633a\u9999\uff0c\u671f\u5f85 \u72ec\u7acb\u7ec4\u4ef6\u3001esbuild \u7ee7\u7eed\u5b8c\u5584\u3002" }, { "author": { "url": "member/rv54ntjwfm3ug8", "name": "rv54ntjwfm3ug8", "avatar": "https://cdn.v2ex.com/avatar/c69a/ef77/522487_large.png?m=1650703805" }, "url": "t/847517", "date_modified": "2022-04-17T11:18:07+00:00", "content_html": "", "date_published": "2022-04-17T11:17:44+00:00", "title": "Angular SSR \u591a\u8bed\u8a00\u7684\u6700\u4f73\u5b9e\u8df5\uff08SEO \u6548\u679c\u597d\uff09\u662f\u4ec0\u4e48\uff1f", "id": "t/847517" }, { "author": { "url": "member/rv54ntjwfm3ug8", "name": "rv54ntjwfm3ug8", "avatar": "https://cdn.v2ex.com/avatar/c69a/ef77/522487_large.png?m=1650703805" }, "url": "t/846948", "title": "Angular \u7684 API \u8bf7\u6c42\u5168\u653e\u5728\u4e00\u4e2a\u670d\u52a1\u91cc\u8fd8\u662f\u5206\u5f00\u4e0d\u540c\u670d\u52a1\u6bd4\u8f83\u597d\uff1f\u5168\u653e\u4e00\u8d77\u611f\u89c9\u6587\u4ef6\u592a\u957f\u4e86\u3002\u53e6\u5916\u670d\u52a1\u548c component \u653e\u4e00\u8d77\u4f1a\u4e0d\u4f1a\u770b\u8d77\u6765\u66f4\u6574\u9f50\u4e00\u4e9b\uff1f\u5b98\u65b9\u597d\u50cf\u4e0d\u662f\u8fd9\u4e48\u505a", "id": "t/846948", "date_published": "2022-04-14T07:43:26+00:00", "content_html": "" }, { "author": { "url": "member/grittiness", "name": "grittiness", "avatar": "https://cdn.v2ex.com/avatar/3a20/37df/174836_large.png?m=1646062183" }, "url": "t/837029", "date_modified": "2022-02-28T15:53:53+00:00", "content_html": "

\u521a\u5f00\u59cb\u5b66\u4e60 Angular \uff0c\u60f3\u901a\u8fc7\u540e\u53f0\u7ba1\u7406\u9875\u9762\u5b66\u4e60\u4e0a\u624b\u3002

\n

Angular \u6587\u6863\u4e0a\u5199\u7684\u61d2\u8def\u7531\u58f0\u660e\u65b9\u5f0f\uff1a

\n
const routes: Routes = [\n {\n path: 'customers',\n loadChildren: () => import('./customers/customers.module').then(m => m.CustomersModule)\n }\n];\n
\n

\u6309\u7167\u4e00\u822c\u540e\u53f0\u7ba1\u7406\u7cfb\u7edf\u7684\u65b9\u5f0f\uff0c\u83dc\u5355\u5217\u8868\u90fd\u662f\u4ece\u63a5\u53e3\u83b7\u53d6\uff0c\u7136\u540e\u524d\u7aef\u518d\u6839\u636e\u63a5\u53e3\u7684\u5217\u8868\u6ce8\u518c\u8def\u7531\u3002\u5728 Angular \u91cc\u4f7f\u7528 Router \u7684 resetConfig \u65b9\u6cd5\u53ef\u4ee5\u66f4\u65b0\u6ce8\u518c\u8def\u7531\uff0c\u90a3\u4e48\u95ee\u9898\u5c31\u662f\uff1a\u63a5\u53e3\u8fd4\u56de\u56de\u6765\u7684\u6bcf\u4e2a\u83dc\u5355\u5bf9\u5e94\u7684\u6a21\u5757 /\u7ec4\u4ef6\u7684\u4fe1\u606f\u80af\u5b9a\u662f\u5b57\u7b26\u4e32\u683c\u5f0f\uff0c\u8981\u600e\u6837\u7684\u65b9\u5f0f\u624d\u80fd\u53d8\u6210\u6587\u6863\u4e2d\u58f0\u660e\u6240\u9700\u7684\u683c\u5f0f\uff1f

\n
import('./customers/customers.module').then(m => m.CustomersModule)\n
\n

\u8fd9\u6216\u8bb8\u770b\u8d77\u6765\u66f4\u50cf\u662f TypeScript \u7684\u4f7f\u7528\u95ee\u9898\uff1f\u7f51\u4e0a\u67e5\u4e86\u4e00\u5708\u8d44\u6599\u90fd\u6ca1\u627e\u5230\u6709\u5173\u7684\u4fe1\u606f\uff08\u4e5f\u53ef\u80fd\u662f\u6211\u65b9\u6cd5\u4e0d\u5bf9\uff09\uff0c\u56e0\u6b64\u524d\u7aef\u5c0f\u767d\u7279\u6765 V2 \u8bf7\u6559\u4e0b\u5404\u4f4d\u5927\u4f6c Angular \u4e0b\u52a8\u6001\u6ce8\u518c\u8def\u7531\u7684\u6b63\u786e\u65b9\u5f0f\uff0c\u611f\u8c22\uff01

\n", "date_published": "2022-02-28T15:51:23+00:00", "title": "\u5c0f\u767d\u8bf7\u6559\u5173\u4e8e Angular \u8def\u7531\u7684\u52a8\u6001\u6ce8\u518c\u65b9\u5f0f", "id": "t/837029" }, { "author": { "url": "member/placeholder", "name": "placeholder", "avatar": "https://cdn.v2ex.com/avatar/0d59/2f15/528055_large.png?m=1687369340" }, "url": "t/836060", "title": "\u5404\u4f4d\u6709\u5199 angular \u7684\u5417\uff1f\u6211\u60f3\u95ee\u4e00\u4e0b\u5173\u4e8e vscode \u63d2\u4ef6\u7684\u95ee\u9898", "id": "t/836060", "date_published": "2022-02-23T17:55:41+00:00", "content_html": "

\u5c31\u662f\u600e\u4e48\u624d\u80fd\u5728 html \u91cc\u5199 class \u7684\u65f6\u5019\uff0c\u80fd\u81ea\u52a8\u63d0\u793a css \u91cc\u9762\u6709\u7684\u5c5e\u6027\uff0c

\n

\u627e\u4e86\u597d\u51e0\u4e2a\u6269\u5c55\u90fd\u4e0d\u597d\u7528\uff0c\u5b9e\u5728\u4e0d\u77e5\u9053\u4e86\u3002

\n" }, { "author": { "url": "member/rv54ntjwfm3ug8", "name": "rv54ntjwfm3ug8", "avatar": "https://cdn.v2ex.com/avatar/c69a/ef77/522487_large.png?m=1650703805" }, "url": "t/834025", "title": "\u4e3a\u4ec0\u4e48\u73b0\u5728\u56fd\u5185\u7528 Angular \u7684\u7f51\u7ad9\u611f\u89c9\u975e\u5e38\u5c11\uff1f", "id": "t/834025", "date_published": "2022-02-15T08:14:52+00:00", "content_html": "\u90fd\u662f React/Vue \uff0c\u597d\u50cf\u597d\u4e45\u6ca1\u89c1 Angular \u4e86\u3002" }, { "author": { "url": "member/rv54ntjwfm3ug8", "name": "rv54ntjwfm3ug8", "avatar": "https://cdn.v2ex.com/avatar/c69a/ef77/522487_large.png?m=1650703805" }, "url": "t/825748", "date_modified": "2022-01-02T02:45:39+00:00", "content_html": "

\u9700\u6c42\uff1a

\n
    \n
  1. \u56fa\u5b9a\u8868\u5934
  2. \n
  3. \u53ef\u52a8\u6001\u6dfb\u52a0\u5217
  4. \n
  5. \u81ea\u9002\u5e94\u5217\u5bbd\uff0c\u53ef\u62d6\u52a8\u8c03\u6574\u5217\u5bbd
  6. \n
  7. \u8d85\u51fa\u90e8\u5206\u663e\u793a\u6a2a / \u7eb5\u5411\u6eda\u52a8\u6761
  8. \n
  9. \u5355\u51fb\u9009\u62e9\u6574\u884c\uff0cCtrl / Shift \u591a\u9009\uff0c\u53f3\u952e\u5f39\u51fa\u83dc\u5355
  10. \n
\n

\u5b9e\u9645\u573a\u666f\u662f\u8ba2\u5355\u7ba1\u7406\uff0c\u56e0\u6b64\u53ea\u9700\u8981\u5217\u8868\u89c6\u56fe\u3002

\n

\u6709\u70b9\u50cf Winform \u7684 ListView \uff0c\u8bd5\u4e86\u4e0b\u8868\u683c\u5f88\u96be\u5b9e\u73b0\uff0c\u770b\u4e86\u4e0b OneDrive \u7528\u7684\u662f\u51e0\u4e2a div \uff0c\u6765\u95ee\u95ee V \u53cb\u6709\u6ca1\u6709\u73b0\u6210\u7684\u8f6e\u5b50\u3002

\n

\u5982\u679c\u6ca1\u6709\u7684\u8bdd\u80fd\u8bf4\u8bf4\u600e\u4e48\u5b9e\u73b0\u6700\u5feb\u4e48\uff1f

\n", "date_published": "2022-01-02T02:44:35+00:00", "title": "Angular \u6709\u6ca1\u6709\u7c7b\u4f3c OneDrive \u7f51\u9875\u7248\u6587\u4ef6\u5217\u8868\u7684\u8f6e\u5b50\uff1f", "id": "t/825748" }, { "author": { "url": "member/wszgrcy", "name": "wszgrcy", "avatar": "https://cdn.v2ex.com/gravatar/580faa0c768668e7325c10e06f49aefc?s=73&d=retro" }, "url": "t/801151", "title": "Angular \u5f00\u53d1\u5c0f\u7a0b\u5e8f", "id": "t/801151", "date_published": "2021-09-10T16:02:08+00:00", "content_html": "

Angular\u5f00\u53d1\u5c0f\u7a0b\u5e8f

\n\n

\u89c6\u9891\u7b80\u4ecb

\n\n

\u5f00\u53d1\u6a21\u677f

\n\n

\u4fee\u6539\u5185\u5bb9

\n\n

\u589e\u52a0\u5185\u5bb9

\n\n

\u5df2\u5b9e\u73b0\u5185\u5bb9

\n\n

\u672a\u5b9e\u73b0

\n

\u53ef\u5b9e\u73b0\u7684\u529f\u80fd

\n\n

\u4e0d\u53ef\u80fd\u5b9e\u73b0\u7684\u529f\u80fd

\n\n

\u5176\u4ed6\u5e73\u53f0\u7684\u652f\u6301

\n\n

\u51c6\u5907\u505a\u7684

\n

component \u7684 template \u91cd\u5199

\n\n" }, { "author": { "url": "member/drealism", "name": "drealism", "avatar": "https://cdn.v2ex.com/avatar/2da6/22f5/538286_large.png?m=1774500973" }, "url": "t/800937", "title": "Angular \u5b66\u8d77\u6765\u771f\u662f\u592a\u96be\u4e86\uff0c \u56fd\u5185\u8d44\u6599\u5c11\uff0c \u7528 G \u641c\u5462\uff0c\u603b\u611f\u89c9\u8868\u8fbe\u4e0d\u51c6\u786e\uff0c\u641c\u4e0d\u5230\u597d\u7684\u7ed3\u679c", "id": "t/800937", "date_published": "2021-09-09T14:31:45+00:00", "content_html": "

\u8bf7\u6559\u4e00\u4e0b\u5927\u4f6c\u4eec\uff0c \u6211\u73b0\u5728\u6709\u4e00\u4e2a\u60c5\u51b5\u662f\u8fd9\u6837\u7684\uff0c\u540e\u7aef\u6211\u7edf\u4e00 \u8fd4\u56de\u683c\u5f0f\u662f:

\n
{\n \"status\": 200,\n \"msg: \"xxx success\",\n \"data\": any\n}\n
\n

\u6211\u60f3\u901a\u8fc7 \u62e6\u622a\u5668 \u6216\u8005\u5728 service \u91cc\u9762\u5c06 status \u5224\u65ad\u597d\u4e86, \u7ed9 component \u7684\u6570\u636e\u5c31 \u4ec5\u662f\u4e0a\u9762\u7684 data, \u51fa\u9519\u5c31\u7ed9\u4e2a \u9ed8\u8ba4\u503c \u8fd9\u6837\u7684\u6548\u679c\uff0c\u4f46\u6211\u5b9e\u5728\u4e0d\u77e5\u9053\u600e\u4e48\u5b9e\u73b0\u4e86\uff0c \u8fd8\u8bf7\u5927\u5bb6\u6307\u70b9\u4e00\u4e8c\u3002

\n" }, { "author": { "url": "member/legstrong", "name": "legstrong", "avatar": "https://cdn.v2ex.com/avatar/300e/8284/435915_large.png?m=1719909212" }, "url": "t/799078", "date_modified": "2021-08-31T08:16:00+00:00", "content_html": "

\u521a\u5f00\u59cb\u770b\u524d\u7aef\u6846\u67b6\uff0c\u5bf9\u670d\u52a1\u7aef\u6e32\u67d3(SSR)\u5f88\u611f\u5174\u8da3\u3002\n\u60f3\u95ee\u4e00\u4e0b\u54ea\u4f4d\u4ec1\u5144\u80fd\u5426\u89e3\u7b54\u4e00\u4e0b\u8fd9\u4e2a\u95ee\u9898\uff0c\u5728\u542f\u52a8 SSR \u540e

\n
npm run dev:ssr\n
\n

Angular \u662f\u600e\u4e48\u533a\u5206\u54ea\u4e00\u90e8\u5206\u7684 JS \u5728\u6d4f\u89c8\u5668\u7aef\u6267\u884c\uff0c\u54ea\u4e00\u90e8\u5206\u5728 Server \u7aef\u6267\u884c\u7684\uff1f

\n

\u5f88\u53ef\u80fd\u662f\u6211\u4f5c\u4e3a\u540e\u7aef\u7a0b\u5e8f\u5458\u5bf9 SSR \u7684\u8ba4\u8bc6\u5b58\u5728\u504f\u9887\u3002\u591a\u591a\u6307\u6559\uff01

\n", "date_published": "2021-08-31T08:15:32+00:00", "title": "\u670d\u52a1\u7aef\u6e32\u67d3(SSR)\u600e\u4e48\u533a\u5206 JS \u4ee3\u7801\u5757\u662f\u5728\u6d4f\u89c8\u5668\u6267\u884c\uff0c\u8fd8\u662f\u5728 Server \u7aef\u6267\u884c\uff1f", "id": "t/799078" }, { "author": { "url": "member/wszgrcy", "name": "wszgrcy", "avatar": "https://cdn.v2ex.com/gravatar/580faa0c768668e7325c10e06f49aefc?s=73&d=retro" }, "url": "t/782950", "title": "[Angular] ngx-center \u5355\u8fd0\u884c\u65f6\u591a\u9879\u76ee\u5171\u4eab\u4f9d\u8d56\u89e3\u51b3\u65b9\u6848", "id": "t/782950", "date_published": "2021-06-11T08:46:53+00:00", "content_html": "

https://github.com/wszgrcy/ngx-center

\n\n" }, { "author": { "url": "member/Rocketer", "name": "Rocketer", "avatar": "https://cdn.v2ex.com/avatar/02a1/fcf0/527231_large.png?m=1610040538" }, "url": "t/781348", "title": "\u6700\u8fd1 Angular \u7684\u5360\u6709\u7387\u6709\u6240\u4e0a\u5347\u5417\uff1f", "id": "t/781348", "date_published": "2021-06-04T05:20:47+00:00", "content_html": "\u6700\u8fd1 LinkedIn \u7ed9\u6211\u63a8\u7684\u5de5\u4f5c\u673a\u4f1a\u5927\u90e8\u5206\u90fd\u8981\u6c42 Angular \u7684\u7ecf\u9a8c\uff0c\u800c\u6211\u53ea\u6709 React \u7684\u7ecf\u9a8c\u3002\u662f Angular \u5b9e\u5728\u627e\u4e0d\u5230\u4eba\uff0c\u6240\u4ee5\u63a8\u5230\u6211\u8fd9\u513f\u6765\u4e86\u5417\uff1f" }, { "author": { "url": "member/gzf6", "name": "gzf6", "avatar": "https://cdn.v2ex.com/avatar/b91f/ab00/215896_large.png?m=1692887842" }, "url": "t/779379", "title": "Angular12 \u6b63\u5f0f\u7248\u53d1\u5e03", "id": "t/779379", "date_published": "2021-05-26T09:28:49+00:00", "content_html": "

https://blog.angular.io/angular-v12-is-now-available-32ed51fbfd49

\n

\u867d\u7136\u516c\u53f8\u7528 vue\uff0c\u4f46\u662f ng \u81ea\u5df1\u8fd8\u662f\u575a\u6301\u5b66\uff0c\u90fd\u8bf4 ng \u96be\uff0cvue \u641e\u5de5\u7a0b\u5316\u4e5f\u662f\u641e\u6b7b\u6211\u4e86\ud83d\ude02\uff0c\u4e0d\u8fc7 vite \u5f00\u53d1\u662f\u771f\u723d

\n" }, { "author": { "url": "member/zhoushushu", "name": "zhoushushu", "avatar": "https://cdn.v2ex.com/gravatar/601fd6b0a33f2ec367b1d6566678bbc9?s=73&d=retro" }, "url": "t/759986", "title": "\u501f\u7740 vue \u548c react \u7684\u601d\u8def\uff0c\u8ddf\u7740 b \u7ad9\u89c6\u9891\u5b66\u4e86\u4e09\u5929 angluar11 \u540e\uff0c\u6211\u6765\u5410\u5410\u69fd\u3002\u3002\u3002", "id": "t/759986", "date_published": "2021-03-09T06:53:02+00:00", "content_html": "

\u624d\u5b66\u4e09\u5929\uff0c\u4e5f\u4e0d\u77e5\u9053\u8bf4\u7684\u5bf9\u4e0d\u5bf9

\n\n

\u5c06\u6765\u6211\u6211\u6765\u7528 angular \u5f00\u53d1\u7684\u8bdd\uff0c\u4f30\u8ba1\u601d\u8def\u7684\u8bdd\uff0c\u4e0d\u4f1a\u50cf angular \u4f20\u7edf\u9879\u76ee\u90a3\u6837\u5404\u79cd\u6ce8\u5165\uff0c\u5e94\u8be5\u8fd8\u662f\u548c vue \u3001react \u5dee\u4e0d\u591a\u5427\uff0cangular \u81ea\u5e26\u7684\u5e93\u4e0d\u7528\uff0c\u5404\u79cd\u7b2c\u4e09\u65b9\u8bf7\u6c42\u5e93\uff0cimport \u3001export\uff0c\u80fd\u4e0d\u6ce8\u5165\u5c31\u4e0d\u6ce8\u5165\u4e86\uff0c\u7ef4\u62a4\u4e0b module \u5c31\u597d\u3002

\n" }, { "author": { "url": "member/sunorg", "name": "sunorg", "avatar": "https://cdn.v2ex.com/gravatar/f9fd0e47a762ec045123ad8879a63221?s=73&d=retro" }, "url": "t/744354", "title": "ng \u662f\u4e0d\u662f\u6ca1\u843d\u4e86\uff0c\u56fd\u5185\u4e66\u7c4d\u53ea\u6709 7 \u7248\u672c", "id": "t/744354", "date_published": "2021-01-12T14:16:45+00:00", "content_html": "

\u56fd\u5916\u7248\u672c\u4e5f\u5c11\u5f97\u53ef\u601c\uff0c\u56fd\u5185\u7684\u4e66\u7c4d\u53ea\u5230\u7248\u672c 7 \u3002 \u73b0\u5728\u90fd 11 \u4e86\u2026

\n

\u4eca\u5929\u624d\u770b\u5230\u591a\u4e86\u4e00\u4e2a 10 \u7684\u4e66\u2026\uff0c\u4ed4\u7ec6\u770b\u76ee\u5f55\uff0c\u51d1\u5b57\u6570\u7684\u5acc\u7591\u4e5f\u5f88\u5927

\n

ps:\u8fd8\u662f\u5f88\u559c\u6b22 ng \u8fd9\u79cd\u5927\u4e00\u7edf\u7684\u67b6\u5b50\uff0c\u7701\u5fc3\u597d\u591a\u2026

\n" }, { "author": { "url": "member/jancing", "name": "jancing", "avatar": "https://cdn.v2ex.com/gravatar/db291d2460a1e560c7f132d3c0cede75?s=73&d=retro" }, "url": "t/707299", "title": "\u50cf\u5bcc\u6587\u672c\u7f16\u8f91\u5668\uff0c\u7ec4\u6001\u8bbe\u8ba1\u5668\u8fd9\u4e9b\u4f20\u7edf\u684c\u9762\u5e94\u7528\u8981\u662f\u653e\u5728 Web \u7aef\u5b9e\u73b0\u7684\u8bdd\uff0c\u9009\u4ec0\u4e48\u6846\u67b6\uff1f", "id": "t/707299", "date_published": "2020-09-15T12:04:29+00:00", "content_html": "" }, { "author": { "url": "member/Ley", "name": "Ley", "avatar": "https://cdn.v2ex.com/avatar/6f78/0a02/8636_large.png?m=1652265051" }, "url": "t/695676", "title": "Angular 9+ \u5347\u7ea7\u5c0f\u8bb0 \u2014\u2014 \u5e94\u4ed8 MSAL-Angular \u4e0e ngx-restangular \u7684\u517c\u5bb9\u6027\u95ee\u9898", "id": "t/695676", "date_published": "2020-08-04T16:13:17+00:00", "content_html": "

\u4e4b\u524d\u51e0\u6b21\u5347\u7ea7 Angular \u7248\u672c\u7684\u7ecf\u5386\u603b\u4f53\u8fd8\u7b97\u987a\u5229\uff0c\u56e0\u6b64\u539f\u672c\u5bf9 Angular 8 \u5347\u7ea7\u5230 9 \u7684\u8fc7\u7a0b\u4e5f\u6bd4\u8f83\u4e50\u89c2\u3002\u867d\u7136 Angular 9 \u5f00\u59cb\u5c06\u9ed8\u8ba4\u542f\u52a8\u65b0\u7684 Angular Ivy\uff0c\u4f46\u8003\u8651\u5230\u5df2\u7ecf\u6b63\u5f0f\u53d1\u5e03\u6570\u6708\uff0c\u751a\u81f3 Android 10 \u90fd\u5df2\u95ee\u4e16\uff0c\u81ea\u5df1\u7684\u9879\u76ee\u53c8\u6ca1\u6709\u7528\u7279\u522b\u51b7\u95e8\u7684\u4f9d\u8d56\uff0c\u4f9d\u7136\u6ca1\u6709\u62c5\u5fc3\u4f1a\u9047\u5230\u95ee\u9898\u3002\u53ef\u60dc\u58a8\u83f2\u5b9a\u5f8b\u65e0\u5904\u4e0d\u5728\uff0c\u6700\u540e\u8fd8\u662f\u82b1\u4e86\u6bd4\u60f3\u8c61\u4e2d\u66f4\u591a\u7684\u65f6\u95f4\u5b8c\u6210\u5347\u7ea7\u3002

\n

\u4e3a\u6b64\uff0c\u672c\u6587\u7b80\u5355\u4ecb\u7ecd\u81ea\u5df1\u5728\u4ece Angular 8 \u5347\u7ea7\u5230 9 \u6700\u7ec8\u5230 10 \u65f6\u9047\u5230\u7684\u95ee\u9898\u53ca\u76f8\u5e94\u7684\u89e3\u51b3\u65b9\u6cd5\uff0c\u4ec5\u4f9b\u53c2\u8003\u3002

\n

\u9996\u5148\uff0cAngular \u5b98\u65b9\u6587\u6863\u63d0\u4f9b\u4e86\u8be6\u7ec6\u7684\u5347\u7ea7\u8bf4\u660e\uff0c\u5efa\u8bae\u5728\u5347\u7ea7\u9879\u76ee\u524d\u9996\u5148\u901a\u89c8\u76f8\u5173\u6587\u6863\uff0c\u4e86\u89e3\u53ef\u80fd\u5b58\u5728\u7684\u95ee\u9898\u3002\u53ef\u4ee5\u4ece\u4e0b\u9762\u7684\u94fe\u63a5\u627e\u5230\u5347\u7ea7\u5230 Angular 10 \u7684\u6700\u65b0\u4fe1\u606f\u3002

\n

https://angular.io/guide/updating-to-version-10

\n

\u4e0b\u9762\u662f\u81ea\u5df1\u5728\u5347\u7ea7\u65f6\u5b9e\u9645\u64cd\u4f5c\u7684\u51e0\u4e2a\u4e3b\u8981\u6b65\u9aa4\uff1a

\n

\u66f4\u65b0 Angular 8 \u76f8\u5173\u4f9d\u8d56\u81f3\u6700\u65b0\u7248

\n\n

\u66f4\u65b0 @azure/msal-angular \u81f3\u6700\u65b0\u7248 1.0.0

\n\n

\u5347\u7ea7\u81f3 Angular 9\uff0c\u68c0\u67e5\u5e76\u4e4e\u7565\u4e00\u4e9b\u4f9d\u8d56\u7248\u672c\u95ee\u9898

\n\n

\u5347\u7ea7\u81f3 Angular 10\uff0c\u68c0\u67e5\u5e76\u4e4e\u7565\u4e00\u4e9b\u4f9d\u8d56\u7248\u672c\u95ee\u9898

\n\n

\u5927\u529f\u544a\u6210

\n

\u5bf9\u4e0a\u8ff0\u6b65\u9aa4\u7684\u4e00\u4e9b\u8be6\u89e3\uff0c\u8bf7\u79fb\u6b65\u6211\u7684\u535a\u5ba2\u6587\u7ae0\u3002

\n

\u5e0c\u671b\u80fd\u5bf9\u5927\u5bb6\u6709\u6240\u5e2e\u52a9\u3002

\n" }, { "author": { "url": "member/xiaoming1992", "name": "xiaoming1992", "avatar": "https://cdn.v2ex.com/avatar/c7e9/042b/284747_large.png?m=1753418917" }, "url": "t/676727", "title": "angular \u6a21\u677f\u4e0d\u591f\"typescript\", \u662f\u6211\u7684\u59ff\u52bf\u4e0d\u5bf9\u5417?", "id": "t/676727", "date_published": "2020-05-29T07:43:36+00:00", "content_html": "

\u60f3\u5c1d\u8bd5angular, \u4f46\u662f\u611f\u89c9angular\u7684\u6a21\u677f\"\u4e0d\u591f typescript\", \u4f8b\u5982\u5b98\u7f51\u4e0a\u7684\u4e00\u6bb5template:

\n
<h2>Products</h2>\n\n<div *ngFor=\"let product of products\">\n\n <h3>\n {{ product.name }}\n </h3>\n\n</div>\n
\n

\u5355\u7eaf\u770b\u8fd9\u4e2a\u6a21\u677f, \u5b8c\u5168\u770b\u4e0d\u51fa\u6765product\u7684\u7c7b\u578b, \u540c\u65f6typescript\u548ceslint\u4e5f\u6ca1\u80fd\u529b\u7ba1\u63a7\u8fd9\u4e2a\u6a21\u677f\u4e2d\u7684\u53d8\u91cf\u3002\u76f8\u5bf9\u7684\u6765\u8bf4, \u5728react\u7684tsx\u4e2d, typescript\u548ceslint\u662f\u80fd\u591f\u5bf9\u53d8\u91cf\u8fdb\u884c\u5145\u5206\u7684\u9759\u6001\u5206\u6790\u7684\u3002

\n

\u65e0\u610f\u5f15\u6218, \u786e\u5b9e\u5e0c\u671b\u8bd5\u8bd5angular, \u53ef\u662f, \u662f\u6211\u4f7f\u7528\u7684\u59ff\u52bf\u4e0d\u5bf9\u5417?

\n" }, { "author": { "url": "member/faceRollingKB", "name": "faceRollingKB", "avatar": "https://cdn.v2ex.com/gravatar/62fff6d0d37ba1ec82b3077f9322b108?s=73&d=retro" }, "url": "t/673709", "title": "\u8fd9\u91cc\u597d\u51b7\u6e05\uff0c\u60f3\u95ee\u4e0b\u6709\u6ca1\u6709\u4ec0\u4e48 angular \u8bba\u575b\u6bd4\u8f83\u706b\u70ed\u7684\uff1f", "id": "t/673709", "date_published": "2020-05-20T09:25:07+00:00", "content_html": "\u76ee\u524d\u516c\u53f8\u4e3b\u6d41\u662f vue\uff0c\u60f3\u627e\u4e2a ng \u8bba\u575b\u62b1\u56e2\u53d6\u6696" }, { "author": { "url": "member/JounQin", "name": "JounQin", "avatar": "https://cdn.v2ex.com/gravatar/71b080e6b164bf13e166532b8a44df9e?s=73&d=retro" }, "url": "t/634264", "title": "\u4e3a\u4ec0\u4e48\u7528 Angular \u7684\u6bd4\u7528 Vue/React \u7684\u5c11\u90a3\u4e48\u591a\uff1f", "id": "t/634264", "date_published": "2020-01-01T16:01:17+00:00", "content_html": "

\u76f8\u5173\u77e5\u4e4e\u95ee\u9898

\n
\n

\u4e11\u8bdd\u8bf4\u5728\u524d\u5934\uff0c\u5982\u679c\u6709\u9519\u8bef\uff0c\u6b22\u8fce\u65a7\u6b63\uff0c\u4e0d\u8981\u73bb\u7483\u5fc3\u3002

\n
\n

\u8bf4\u5b9e\u8bdd\u867d\u7136\u5728\u7075\u96c0\u4e91\u7528 Angular \u505a\u7740\u4f01\u4e1a\u7ea7\u7684\u5e94\u7528\uff0c\u4f46\u6211\u4e2a\u4eba\u662f\u5f88\u4e0d\u8ba4\u53ef\u5b83\u5927\u800c\u5168\u7684\u54f2\u5b66\u7684\uff0c\u867d\u7136\u6211\u4e5f\u5728 Angular \u76f8\u5173\u4e13\u680f\u53d1\u8fc7\u51e0\u7bc7\u6c34\u6587\uff0c\u4f46\u662f\u4e60\u60ef\u4e86 React \u548c Vue \u300e\u7eaf\u7cb9\u300f\u6846\u67b6\u7684\u54f2\u5b66\u540e\u4f9d\u65e7\u5f88\u4e0d\u559c\u6b22\uff08\u4e0d\u559c\u52ff\u55b7\uff09\uff0c\u4f46\u6211\u5f88\u611f\u8c22 Angular \u5e26\u6211\u5165\u4e86 rxjs \u7684\u5751\uff0c\u4ec5\u6b64\u800c\u5df2\u3002

\n

Angular \u7684\u6a21\u5757\u7cfb\u7edf\u548c bundler \u90fd\u662f\u81ea\u5df1\u641e\u5f97\u4e00\u5957\u6807\u51c6\u300e\u9ed1\u76d2\u300f\uff0c\u4e5f\u5c31\u662f\u8bf4\u6ca1\u529e\u6cd5\u5728\u5404\u4e2a\u6846\u67b6\u76f4\u63a5\u5e73\u6ed1\u5730\u5207\u6362\uff0c\u6bd4\u5982 http \u8bf7\u6c42\u5e93\uff0c\u5176\u4ed6\u6846\u67b6\u90fd\u53ef\u4ee5\u968f\u4fbf\u9009\uff0c\u4e00\u822c\u6bd4\u8f83\u901a\u7528\u7684\u662f axios\uff0c\u8fd8\u6709 axios-observable \u652f\u6301 Observable API\uff0c\u4f46 Angular \u4e3a\u4e86\u66f4\u597d\u5730\u652f\u6301\u81ea\u5df1\u7684 DI \u53c8\u641e\u4e86\u4e00\u4e2a @angular/common/http \uff0c\u5176\u5b9e\u5927\u53ef\u4ee5\u628a DI \u90e8\u5206\u62bd\u6210\u4e00\u4e2a\u5e93\u561b\uff08\u4ee5\u524d\u662f\u5355\u72ec\u62bd\u4e86\u4e00\u4e2a DI \u5305\u7684\uff0c\u540e\u9762\u53c8\u88ab\u5408\u5230 core \u91cc\u4e86\uff09\uff0c\u8fd9\u6837\u6240\u6709\u6846\u67b6\u90fd\u80fd\u4f7f\u7528\u4f60\u8fd9\u4e2a DI \u7cfb\u7edf\uff0c\u5c82\u4e0d\u7f8e\u54c9\uff1fts \u6253\u5305\u975e\u8981\u6574\u51fa\u4e00\u4e2a ngfactory \u7684\u6982\u5ff5\uff0c\u8fde\u57fa\u672c\u7684\u5e93\u6253\u5305\u90fd\u8981\u6709\u4e2a\u4e13\u95e8\u7684 ng-packagr\uff0c\u771f\u5fc3\u53d7\u4e0d\u4e86\uff0c\u5b66\u4f1a rollup/webpack \u5df2\u7ecf\u5f88\u4e0d\u5bb9\u6613\u4e86\uff0c\u6362\u4e2a\u524d\u7aef\u6846\u67b6\u8fd8\u8981\u5b66\u8fd9\u4e2a\uff1f\uff1f\uff1f\u8fd8\u6709\u5404\u79cd NgModule \u7684\u62a5\u9519\u4fe1\u606f\u5b9e\u5728\u4e0d\u5fcd\u76f4\u89c6\uff0c\u7528\u4e86 @angular/router \u540e\u5b83\u8fd8\u76f4\u63a5\u7ed9\u6211\u9000\u51fa\u5230\u4e0a\u4e00\u4e2a\u65e0\u62a5\u9519\u7684\u9875\u9762\u4e86\uff0c\u4e5f\u5c31\u662f\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u8fd8\u5f97\u518d\u70b9\u4e00\u6b21\u4fdd\u5b58\u9875\u9762\u7684\u5165\u53e3\uff0c\u5982\u679c\u8fd8\u6709\u9519\uff0c\u8fd8\u5f97\u7ee7\u7eed\u6765\uff1f\uff01

\n

\u8bf4\u5230\u8fd9\u91cc\u5b9e\u5728\u4e0d\u5f97\u4e0d\u518d\u5410\u69fd Angular \u5bf9 hmr(hot module reload) \u7684\u652f\u6301\u7b80\u76f4\u5f31\u7206\u4e86\uff0c\u751a\u81f3\u53ef\u4ee5\u8bf4\u662f\u300e\u5783\u573e\u300f\uff0c\uff08\u6211\u7684\u4e2a\u4eba\u4f53\u9a8c\u6765\u8bf4 Vue \u7684 hmr \u652f\u6301\u662f\u6700\u597d\u7684\uff09\uff0c\u5f00\u53d1\u4e2a\u65b0\u529f\u80fd\u9875\u9762\u4e0d\u505c\u5730 reload, reload, reload... \u6211\u5df2\u7ecf\u653e\u5f03\u6323\u624e\u4e86\u3002

\n

\u6709\u4eba\u4f1a\u8bf4\u8fd9\u4e9b @angular/cli \u90fd\u5e2e\u4f60\u89e3\u51b3\u4e86\u554a\uff0c\u8fd9\u8fd8\u662f\u521a\u521a\u300e\u9ed1\u76d2\u300f\u7684\u95ee\u9898\uff0c\u8fd9\u4e5f\u662f\u6211\u81ea\u5df1\u5199\u9879\u76ee\u90fd\u662f\u4e0d\u7528\u4ec0\u4e48\u6240\u8c13\u7684 cli \u7684\uff0c\u800c @angular/cli \u91cc\u6211\u53ea\u7528\u4f1a\u7528\u4e24\u4e2a\u547d\u4ee4\uff1ang serve \u548c ng build\uff0c\u800c\u4e14\u662f\u5728\u7528 @alauda/custom-webpack \u7684\u524d\u63d0\u4e0b\uff0c\u56e0\u4e3a\uff1a\u6211\u538b\u6839\u513f\u4e0d\u9700\u8981\u9ed8\u8ba4\u7684\u90a3\u5957\u6253\u5305\u914d\u7f6e\uff0c\u5bf9\u6211\u4eec\u7684\u751f\u4ea7\u529b\u53cd\u800c\u662f\u963b\u788d\u3002\u4e3a\u4ec0\u4e48 Angular \u4e0d\u80fd\u5f80\u548c\u5176\u4ed6\u6846\u67b6\u4e00\u6837\u7eaf\u6846\u67b6\u7684\u65b9\u5411\u8d70\u5462\uff1f\u90a3\u4e9b\u4ec0\u4e48 ng lint/test \u4e4b\u7c7b\u7684\u547d\u4ee4\u771f\u662f\u9189\u4e86\uff0c\u8fd9\u4e0d\u662f\u8131\u88e4\u5b50\u653e\u5c41\u5417\uff1f\u81ea\u5df1\u52a0\u4e2a lint/test \u811a\u672c\u7684\u4e8b\u513f\u6211\u4e3a\u4ec0\u4e48\u8981\u53bb\u5355\u72ec\u5b66\u554a\uff1f\u975e\u5f97\u5728angular.json \u91cc\u914d\u7f6e\uff1f\u8bf4\u5230 angular.json \u5c31\u66f4\u53ef\u7b11\u4e86\uff0c\u8fde js \u683c\u5f0f\u90fd\u4e0d\u652f\u6301\uff1f\u6bcf\u4e2a\u516c\u53f8\u4e0d\u540c\u9879\u76ee\u90fd\u8981 copy/paste \u5417\uff1f\u8fd9\u4e5f\u662f\u4e3a\u4ec0\u4e48\u6211\u5728\u7075\u96c0\u4e91\u641e\u4e86 @alauda/custom-webpack \u7684\u539f\u56e0\uff0c\u56e0\u4e3a\u81ea\u5b9a\u4e49 webpack \u914d\u7f6e\u5728\u516c\u53f8\u5185\u90e8\u9879\u76ee\u91cc\u4e5f\u662f\u901a\u7528\u7684\u554a\u3002

\n

\u6211\u4eec\u518d\u6765\u770b\u4e00\u4e2a css \u6253\u5305\u7684\u95ee\u9898\uff0cAngular \u7684\u65b9\u6848\u662f\u628a css \u6587\u4ef6\u5185\u5bb9\u5904\u7406\u5b8c\u8f6c\u5316\u6210\u5b57\u7b26\u4e32\uff0c\u7136\u540e\u8fd0\u884c\u65f6\u7531 @angular/core \u8fdb\u884c\u63d2\u5165\uff0c\u8fd9\u6709\u4ec0\u4e48\u95ee\u9898\uff1f\u95ee\u9898\u5927\u4e86\uff0c\u6bd4\u5982 A/B \u7ec4\u4ef6\u90fd\u5728 styleUrls \u91cc\u5f15\u7528\u4e86 common.css \u90a3\u4e48\u6700\u7ec8\u5b83\u4f1a\u628a common inline \u5230 A \u548c B \u4e0a\uff0c\u4e5f\u5c31\u662f css \u5185\u5bb9\u662f\u91cd\u590d\u7684\uff0c\u4ec0\u4e48 vue-style-loader \u5b83\u4e0d\u9999\u5417\uff1f\u660e\u660e\u662f bundler \u8be5\u505a\u7684\u4e8b\u60c5\u4e3a\u4ec0\u4e48\u8981\u8dd1\u5230\u6846\u67b6\u5c42\u53bb\u505a\uff1f\uff1f\uff1f

\n

\u8fd8\u6709\u4e4b\u524d\u5439 JIT \u5230 AOT \u4f18\u5316\u7684\u4e8b\u513f\uff0c\u4f60\u770b vue \u5439\u8fc7\u5417\uff1fvue/vue-loader \u4e00\u76f4\u90fd\u662f\u539f\u751f\u652f\u6301\u6240\u8c13\u7684\u300eAOT\u300f\u7684\uff0c\u5230\u4e86 Angular \u8fd9\u513f\u5c31\u53d8\u6210\u4e86\u5927\u4f18\u5316\u4e86\uff0c\u800c\u4e14\u6240\u6709\u76f8\u5173\u5e93\u548c App \u90fd\u8981\u505a\u4e00\u4e9b\u5fc5\u8981\u7684\u4fee\u6539\u624d\u80fd\u652f\u6301 AOT\uff0c\u800c\u4e14\u8fd9\u4e2a AOT \u5462\u8fd8\u6709\u5404\u79cd\u4e71\u4e03\u516b\u7cdf\u7684\u9650\u5236\uff0c\u4e00\u4e0d\u5c0f\u5fc3\u5c31\u662f build error \u8bf4\u4ec0\u4e48\u54ea\u91cc\u54ea\u91cc\u4e0d\u652f\u6301\u7bad\u5934\u51fd\u6570\u3001\u54ea\u91cc\u54ea\u91cc\u5f97\u628a\u53d8\u91cf\u5bfc\u51fa\u53bb\uff0c\u53ef\u8fd9\u4e9b JIT \u7684\u65f6\u5019\u660e\u660e\u90fd\u662f\u597d\u597d\u7684\u3002\u5bf9\u4e86\uff0cJIT \u548c AOT \u7684\u53d8\u66f4\u68c0\u6d4b\u6b21\u6570\u8fd8\u662f\u7b56\u7565\u597d\u50cf\u8fd8\u4e0d\u592a\u4e00\u6837\uff0c\u4e0a\u6b21 ngChina \u7684\u65f6\u5019\u6709\u5609\u5bbe\u6f14\u793a\u4e86\u4e00\u4e0b\uff0c\u8fd9\u771f\u4e0d\u662f\u529d\u9000\u5417\uff1f

\n

\u518d\u6765\uff0cAngular \u7684\u7ef4\u62a4\u8005\u4eec\u4f3c\u4e4e\u90fd\u559c\u6b22\u81ea\u5df1\u73a9\u513f\u81ea\u5df1\u7684\uff0c\u8fde i18n \u65b9\u6848\u5b83\u90fd\u5e2e\u4f60\u5185\u7f6e\u4e86\uff0c\u5f53\u7136\u6211\u80af\u5b9a\u662f\u4e0d\u7528\u7684\uff0c\u56e0\u4e3a\u548c\u5176\u4ed6\u6846\u67b6\u7684\u4f7f\u7528\u65b9\u5f0f\u5dee\u5f02\u592a\u5927\uff0c\u5b9e\u5728\u8be1\u5f02\u3002\u6211\u4eec\u4e4b\u524d\u662f\u7528\u7684 @ngrx/translste \uff0c\u4eca\u5e74\u6211\u300e\u4e8c\u8fdb\u5bab\u300f\u56de\u6765\u5c31\u628a\u8fd9\u90e8\u5206\u7cbe\u7b80\u91cd\u5199\u4e86\uff0c\u53ea\u4fdd\u7559\u5e76\u5b9a\u5236\u6211\u4eec\u81ea\u5df1\u9700\u8981\u7684\u4e1c\u897f\u3002\u4e5f\u5c31\u662f\u8bf4\u5b98\u65b9\u5185\u7f6e\u7684\u65b9\u6848\u5b83\u4e0d\u4e00\u5b9a\u662f\u6700\u597d\u7684\u6216\u8005\u8bf4\u662f\u5bf9\u6240\u6709\u4eba\u90fd\u9002\u7528\u7684\u3002

\n

\u6700\u540e\u5462\uff0c\u518d\u8bf4\u8bf4\u51e0\u4e2a\u6846\u67b6\u5bf9 SSR \u7684\u652f\u6301\uff0cVue \u662f\u6709\u5b98\u65b9\u6307\u5bfc\u7684\uff0cReact \u63d0\u4f9b\u4e86\u57fa\u7840\u80fd\u529b\uff0c\u4f46\u662f\u5177\u4f53\u600e\u4e48\u73a9\u513f\u5168\u51ed\u793e\u533a\uff0cAngular\u6211\u611f\u89c9\u662f\u5bf9\u8fd9\u4e00\u5757\u513f\u4e0d\u4e0a\u5fc3\u7684\uff0c\u597d\u50cf\u5230\u73b0\u5728\u90fd\u53ea\u6709 express \u76f8\u5173\u7684\u6307\u5bfc\uff0c\u4e0d\u8fc7\u6bd5\u7adf\u76ee\u6807\u662f\u300e\u4f01\u4e1a\u7ea7\u5e94\u7528\u300f\u561b\uff0c\u57fa\u672c\u662f\u4e0d\u9700\u8981\u8003\u8651 SEO \u95ee\u9898\u3002\u90a3\u65e2\u7136 Angular \u662f\u66f4\u9762\u5411\u4f01\u4e1a\u7ea7\u5e94\u7528\u7684\uff0c\u90a3\u4e48\u4e2a\u4eba\u5e94\u7528\u5c31\u6ca1\u5fc5\u8981\u9009\u5b83\u4e86\u561b\u3002\u90a3\u65e2\u7136\u6211\u4e2a\u4eba\u5e94\u7528\u90fd\u6ca1\u6709\u7528\u8fc7 Angular \u6211\u600e\u4e48\u6562\u5728\u516c\u53f8\u9879\u76ee\u91cc\u53bb\u7528\u5462\uff1f\uff08\u6b64\u5904\u624b\u52a8\u72d7\u5934\uff09

\n

\u6240\u4ee5\u50cf React \u548c Vue \u8fd9\u79cd\u7684\u8f7b\u91cf\u7ea7\u6846\u67b6\u624d\u4f1a\u66f4\u6d41\u884c\uff0c\u56e0\u4e3a\u5b83\u4eec\u624d\u4ee3\u8868\u4e86\u81ea\u7531\uff0c\u800c\u6211\u548c\u5f88\u591a\u4eba\u4e00\u6837\u4e0d\u559c\u6b22\u88ab\u675f\u7f1a\uff0c\u66f4\u4f55\u51b5\u53ea\u662f\u4e00\u4e2a\u524d\u7aef\u6846\u67b6\uff0c\u6240\u4ee5\u6211\u7684\u4e2a\u4eba\u9879\u76ee\u662f\u7edd\u4e0d\u4f1a\u8003\u8651\u7528 Angular \u7684\u3002\u800c\u516c\u53f8\u7684\u9879\u76ee\uff0c\u5f53\u521d\u9009\u62e9 Angular \u7684\u5927\u54e5\u5df2\u7ecf\u540e\u6094\u5e76\u79bb\u804c\u53bb\u5199 React \u4e86\uff0c\u800c\u73b0\u5728\u7684\u6211\u4eec\u8fd9\u4e9b\u63a5\u76d8\u4fa0\u8fd8\u5c06\u7ee7\u7eed\u4f7f\u7528\uff0c\u6bd5\u7adf\u5386\u53f2\u5305\u88b1\u5c3e\u5927\u4e0d\u6389\u3002\u4f46\u6211\u4ecd\u7136\u8981\u611f\u8c22 Angular \u5e26\u6211\u8d70\u5165 Observable \u7684\u4e16\u754c\uff0c\u6b63\u5982 @\u5f90\u98de \u6240\u8bf4\uff0c\u6211\u76f8\u4fe1 React/Vue \u793e\u533a\u7ecf\u8fc7 hooks \u7684\u6d17\u793c\u4e5f\u53ef\u80fd\u4f1a\u62e5\u62b1\u5929\u7136\u7ec4\u5408\u7684 Observable\u3002

\n
\n

\u5199\u7740\u5199\u7740\u597d\u50cf\u53d8\u6210\u4e86\u62a8\u51fb Angular \u7684\u6587\u7ae0\uff0c\u4f46\u5176\u5b9e\u4e0d\u662f\uff0c\u841d\u535c\u9752\u83dc\u5404\u6709\u6240\u7231\uff0c\u6709\u4eba\u559c\u6b22\u6846\u67b6\u7684\u7ea6\u675f\uff0c\u8ba9\u4e0d\u592a\u4f1a\u5199\u4ee3\u7801\u7684\u4eba\u4e5f\u80fd\u5199\u51fa\u4e0d\u90a3\u4e48\u5dee\u7684\u4ee3\u7801\uff0c\u800c\u6211\u4e2a\u4eba\u559c\u6b22\u81ea\u7531\u7684\u4ee3\u7801\uff0c\u8fd9\u6837\u624d\u80fd\u663e\u793a\u51fa\u6211\u7684\u67b6\u6784\u80fd\u529b\u4e0d\u662f\uff1f\uff08\u7ee7\u7eed\u72d7\u5934\uff09

\n
\n

\u672c\u6587\u9996\u53d1\u4e8e \u77e5\u4e4e\u4e13\u680f - 1stG \u5168\u6808\u4e4b\u8def

\n" }, { "author": { "url": "member/Ley", "name": "Ley", "avatar": "https://cdn.v2ex.com/avatar/6f78/0a02/8636_large.png?m=1652265051" }, "url": "t/606505", "title": "AngularGo \u2014\u2014 \u4e00\u4e2a\u5f00\u6e90 Angular SPA \u6a21\u677f", "id": "t/606505", "date_published": "2019-10-05T15:58:24+00:00", "content_html": "

\u5728\u63a5\u89e6 Angular \u540e\uff0c\u8fd9\u4e9b\u5e74\u5de5\u4f5c\u4e1a\u4f59\u4e5f\u7528 Angular \u505a\u4e86\u82e5\u5e72\u5b9e\u9645\u9879\u76ee\u3002\u4e0d\u8fc7\uff0c\u7531\u4e8e Angular \u5728\u56fd\u5185\u7684\u6d41\u884c\u5ea6\u4e0d\u9ad8\uff0c\u5404\u79cd\u539f\u521b\u5185\u5bb9\u548c\u53c2\u8003\u8d44\u6599\u4e5f\u76f8\u5bf9\u8f83\u5c11\u3002\u867d\u7136\u7f51\u7edc\u4e0a\u4e5f\u80fd\u627e\u5230\u5404\u79cd\u5404\u6837\u7684\u6280\u672f\u6587\u7ae0\uff0c\u5b98\u65b9\u7684\u6587\u6863\u4e5f\u5f88\u5168\u9762\uff0c\u4f46\u603b\u7684\u6765\u8bb2\uff0c\u4fe1\u606f\u8fd8\u662f\u6709\u4e9b\u5206\u6563\u3002

\n

\u5f88\u60ed\u6127\uff0c\u51e0\u5e74\u91cc\u6ca1\u6709\u505a\u4ec0\u4e48\u7279\u522b\u6709\u6280\u672f\u542b\u91cf\u7684\u5de5\u4f5c\u3002 \u53ea\u662f\u63d0\u70bc\u51fa\u4e00\u4e2a\u5f88\u57fa\u7840\u7684\u6a21\u677f\uff0c\u5e2e\u52a9\u5f00\u53d1\u8005\u5feb\u901f\u521b\u5efa\u4e00\u4e2a SPA \uff08 Single Page Application \uff09\u7ad9\u70b9\uff0c\u6216\u662f\u4f9b\u5bf9 Android \u611f\u5174\u8da3\u7684\u8bfb\u8005\u4e86\u89e3 Android \u7684\u8bed\u6cd5\u548c\u57fa\u672c\u7684\u6846\u67b6\u673a\u5236\u3002\u8be5\u6a21\u677f\u5148\u5206\u4eab\u4e8e\u6b64 \u2014\u2014 AngularGo on GitHub\u3002

\n

\u8be5\u6a21\u677f\u57fa\u4e8e\u76ee\u524d\u6700\u65b0\u7684 Angular 8\uff0c\u4e14\u4f1a\u6301\u7eed\u8ddf\u8fdb\u66f4\u65b0\u3002\u5728 Angular CLI \u81ea\u52a8\u521b\u5efa\u7684\u8303\u4f8b\u9879\u76ee\u7684\u57fa\u7840\u4e0a\uff0c\u76ee\u524d\u7248\u672c\u7684 AngularGo \u8fd8\u5305\u542b\u4ee5\u4e0b\u5185\u5bb9\uff1a

\n\n

AngularGo \u8fd8\u5f88\u521d\u6b65\uff0c\u5f88\u591a\u7ec6\u8282\u56e0\u6c34\u5e73\u6709\u9650\u548c\u65f6\u95f4\u9650\u5236\u5199\u5f97\u4e5f\u6bd4\u8f83\u7c97\u7cd9\uff0c\u60f3\u5fc5\u4f1a\u6709\u5176\u4ed6\u4f18\u79c0\u7684\u5f00\u6e90\u6a21\u677f\u63d0\u4f9b\u4e86\u66f4\u597d\u7684\u5b9e\u73b0\u3002\u4ece\u67d0\u79cd\u610f\u4e49\u4e0a\u6765\u8bb2\uff0c\u8be5\u6a21\u677f\u4e00\u65b9\u9762\u662f\u5bf9\u81ea\u5df1\u7ecf\u9a8c\u5f97\u4e00\u4e2a\u6574\u7406\uff0c\u540c\u65f6\u671f\u671b\u80fd\u8d77\u5230\u4e00\u4e2a\u629b\u7816\u5f15\u7389\u7684\u4f5c\u7528\u3002\u5e0c\u671b\u5bf9\u8bfb\u8005\u6709\u5e2e\u52a9\uff0c\u4e5f\u6b22\u8fce\u6279\u8bc4\u6307\u6559\u3002

\n

via

\n" }, { "author": { "url": "member/Hanggi", "name": "Hanggi", "avatar": "https://cdn.v2ex.com/avatar/85f6/cdb0/156814_large.png?m=1669342847" }, "url": "t/589211", "title": "\u6709\u6ca1\u6709\u597d\u770b\u7684 Angular/material \u4e3b\u9898\uff1f", "id": "t/589211", "date_published": "2019-08-05T07:23:03+00:00", "content_html": "

https://material.angular.io/guide/theming

\n

Material \u4e3b\u9898\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u4e3b\u8981\u662f\u9ed8\u8ba4\u4e3b\u9898\u989c\u8272\u592a\u6fc0\u8fdb\u4e86\uff0c\u6709\u6ca1\u6709\u597d\u770b\u7684\u4e3b\u9898\u5305\u63a8\u8350\uff1f

\n" }, { "author": { "url": "member/Hanggi", "name": "Hanggi", "avatar": "https://cdn.v2ex.com/avatar/85f6/cdb0/156814_large.png?m=1669342847" }, "url": "t/581338", "title": "\u5982\u4f55\u8bc4\u4ef7 MaterialUI\uff1f", "id": "t/581338", "date_published": "2019-07-09T06:57:20+00:00", "content_html": "

\u4e3a\u4ec0\u4e48\u90fd\u89c9 MaterialUI \u4e11\uff1f\u4f46\u4e3a\u5565\u9879\u76ee\u90a3\u4e48\u706b\u5462\uff1f

\n" }, { "author": { "url": "member/qxn", "name": "qxn", "avatar": "https://cdn.v2ex.com/avatar/7d09/5b6d/361005_large.png?m=1541746506" }, "url": "t/576599", "date_modified": "2019-06-23T04:29:24+00:00", "content_html": "

github \u5730\u5740\uff1a https://github.com/qianxiaoning/demo-angularJs1.7.5 \u6b22\u8fce\u5927\u5bb6 star \u6216\u8005 fork \u5440~

\n\n
src/\n components/ \u7ec4\u4ef6\n config/\n dict.js \u4e00\u4e2a\u5168\u5c40\u53d8\u91cf\u7684 run \u65b9\u6cd5\n router.js \u8def\u7531\u8868\n validation.js 'angular-validation'\u7684 config \u914d\u7f6e\n controllers/ \u63a7\u5236\u5668\n data/ \u6570\u636e mock \u6587\u4ef6\n directives/ \u6307\u4ee4\n filters/ \u8fc7\u6ee4\u5668\n image/ \u56fe\u7247\n pages/ \u9875\u9762\n services/ \u670d\u52a1\uff08\u516c\u5171\u65b9\u6cd5\uff09\n app.js \u5165\u53e3\u51fd\u6570\n common.less \u516c\u5171\u6837\u5f0f\u6587\u4ef6\n index.html html \u6a21\u677f\u6587\u4ef6\n
\n", "date_published": "2019-06-23T04:28:55+00:00", "title": "\u6574\u7406\u4e86\u4e00\u4e0b angularJs \u7684 webpack \u6a21\u677f", "id": "t/576599" } ] } ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86