NativeScript / NativeScript/angular
Angular computed signals are not getting updated
還沒有人認領這個 Issue。
- 主要語言
- TypeScript
- 星號
- 55
- 分支
- 13
- 平均合併
- 16 分鐘
- 30 天內合併 PR
- 1
描述
Environment
OS: macOS 14.1.2
CPU: (10) arm64 Apple M1 Pro
Shell: /bin/zsh
node: 18.17.1
npm: 9.6.7
nativescript: 8.6.1
# android
java: 11.0.21
ndk: Not Found
apis: Not Found
build_tools: Not Found
system_images: Not Found
# ios
xcode: 15.1/15C65
cocoapods: 1.14.3
python: 3.11.6
python3: 3.11.6
ruby: 2.7.8
platforms:
- DriverKit 23.2
- iOS 17.2
- macOS 14.2
- tvOS 17.2
- watchOS 10.2
Dependencies
"dependencies": {
"@angular/animations": "17.0.8",
"@angular/common": "17.0.8",
"@angular/compiler": "17.0.8",
"@angular/core": "17.0.8",
"@angular/forms": "17.0.8",
"@angular/platform-browser": "17.0.8",
"@angular/platform-browser-dynamic": "17.0.8",
"@angular/router": "17.0.8",
"@apollo/client": "3.8.8",
"@mnd/external-web-view": "file:../app-plugins/dist/packages/external-web-view/mnd-external-web-view-1.0.1.tgz",
"@nativescript/angular": "17.0.0",
"@nativescript/core": "8.6.2",
"@nativescript/iqkeyboardmanager": "2.1.1",
"@nativescript/localize": "5.2.0",
"@nativescript/mlkit-barcode-scanning": "file:../app-plugins-customized/mlkit/dist/packages/mlkit-barcode-scanning/nativescript-mlkit-barcode-scanning-2.0.0.tgz",
"@nativescript/mlkit-core": "file:../app-plugins-customized/mlkit/dist/packages/mlkit-core/nativescript-mlkit-core-2.0.0.tgz",
"@nativescript/secure-storage": "3.0.3",
"@nativescript/theme": "3.0.2",
"@nativescript/ui-charts": "0.2.4",
"apollo-angular": "6.0.0",
"apollo3-cache-persist": "0.14.1",
"d3-ease": "3.0.1",
"graphql": "16.8.1",
"graphql-tag": "2.12.6",
"intl": "1.2.5",
"moment": "2.29.4",
"nativescript-health-data": "file:../app-plugins-customized/nativescript-health-data/publish/package/nativescript-health-data-2.0.0.tgz",
"nativescript-oauth2-ext": "file:../app-plugins-customized/nativescript-oauth2-ext/publish/package/nativescript-oauth2-ext-3.0.3.tgz",
"nativescript-sqlite": "2.8.6",
"nativescript-sqlite-commercial": "file:../app-plugins-customized/commercial-sqlite/nativescript-sqlite-commercial-1.8.0.tgz",
"nativescript-sqlite-encrypted": "file:../app-plugins-customized/commercial-sqlite/nativescript-sqlite-encrypted-1.6.0.tgz",
"nativescript-ui-calendar": "15.2.3",
"nativescript-ui-gauge": "15.2.3",
"qs": "npm:querystring@0.2.1",
"rxjs": "7.8.1",
"util": "0.12.5",
"uuidjs": "5.0.1",
"zone.js": "0.14.2"
},
"devDependencies": {
"@angular-devkit/build-angular": "17.0.7",
"@angular/compiler-cli": "17.0.8",
"@graphql-codegen/cli": "5.0.0",
"@graphql-codegen/fragment-matcher": "5.0.0",
"@graphql-codegen/introspection": "4.0.0",
"@graphql-codegen/typescript": "4.0.1",
"@graphql-codegen/typescript-apollo-angular": "4.0.0",
"@graphql-codegen/typescript-operations": "4.0.1",
"@nativescript/android": "8.6.2",
"@nativescript/ios": "8.6.3",
"@nativescript/types": "8.6.1",
"@nativescript/webpack": "5.0.18",
"@ngtools/webpack": "17.0.7",
"@types/d3-ease": "3.0.2",
"@types/intl": "1.2.2",
"@types/lodash": "^4.14.202",
"@types/node": "20.10.5",
"keycloak-request-token": "0.1.0",
"rimraf": "5.0.5",
"sass": "1.69.5",
"ts-node": "10.9.2",
"typescript": "5.2.2"
}
Describe the bug
I am currently upgrading my app to use Angulars new signal api. WritableSignal is working as expected. However computed signals seem to be not working correctly. My computed signals are initialised correctly but are not update if the referenced WritableSignal is updated with .set() or .update(()=>{}) functions. If I convert the WritabelSignal with toObservable() (my current workaorund) things are working as expected.
I am also observing that WritableSignal changes to not always lead to rerendering of the component. When changing the WritableSignal Value in the observable subscription as shown below, I have to call ChangeDetectorRef.detectChanges() to update the ui.
To Reproduce
Here is an example computed signal:
public _onSubMenuPage = computed(() => this.navSrv._currentRoute().startsWith('/sub-menu('));
This references:
public _currentRoute = signal('');
which I tried to update with .set() and .update() methods
Expected behavior
I expected the computed signal to be updated when its value changes to a different value than the current one.
Sample project
Additional context
When I convert the WritableSignal to an observable and subscribe to it, I get notfied through changes. This can be considered as a workaround as long as the computed methods is not working.
this._currentRoute$ = toObservable(this.navSrv._currentRoute);
Update: The issue might be related to the fact that I am using the signals in components that reside in different PageRouterOutlets. I can use an effect(()=>void) to update component state but than have to call ChangeDetectorRef.detectChanges() in order for the changes to get rendered.
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
先使用 _onSubMenuPage 和 _currentRoute 重現 computed signal 範例,然後比較直接更新 signal 與 toObservable workaround。調查不同 PageRouterOutlets 中的 signal 更新與渲染,包括是否需要 ChangeDetectorRef.detectChanges()。完成的標準是 computed 值會更新,且元件無需手動 change detection 即可重新渲染。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- angular, typescript
- 領域
- frontend, mobile
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 停滯
- 描述清晰度
- 需要釐清
- 新手友好度
- 25/100