[英]Using observables in Dart for Angular2 change detection
在我用Dart編寫的Angular2應用程序中,我有幾個服務跟蹤組件之間共享的數據,這些服務在視圖中不一定有任何特定的關系。 我需要將任何組件發起的更新反映在每個組件的顯示中,我想要OnPush
更改檢測的性能優勢,我需要組件來顯示在創建組件之前可能已設置的值,並且我希望所有這些都是用最少的樣板完成。
我的研究表明Observables可能就是我所需要的,但我無法在幾個方面找到明確的答案。
Dart中的Observable實現是否適用於Angular2?
與Dart Stream有明顯不同的Observable嗎? 除了收到有關未來更新的通知之外,Observable還特別支持獲取當前值嗎?
最后但並非最不重要的是,假設Observable滿足我的要求,那么聲明組件的Observable String屬性的最小語法是什么,用從注入的服務檢索的Observable初始化它,在組件的模板中顯示它的值(從pre開始) - 現有值),並且對其值進行更新會自動標記組件以進行推送更改檢測嗎?
如果Observable對此不起作用,我該怎么辦呢? 我目前的想法是使用自定義Stream
子類,它在新偵聽器接收的任何其他內容之前插入最新值,並通過async
管道發送該子類以處理從流中提取值並標記更改檢測。
我理想的解決方案在使用中看起來像這樣:
@Injectable()
class MyService {
@observable int health;
}
@Component(
...)
class MyComponent {
@observable int health;
MyComponent(MyService service) : health = service.health;
}
在模板中:
<span>{{health | async}}</span>
或者對於真正的理想,雖然這將不得不以某種方式掛鈎到Angular的模板編譯(可能有一個變換器?我還沒有學到它們是如何工作的):
<span>{{health}}</span>
只有這樣,它才會奏效。
我現在工作的自定義解決方案不是那么方便,但它很接近。
對於集合和類,您可以使用https://pub.dartlang.org/packages/observe 。 它不是專門設計用於Angular2,而是用於Polymer <= 0.16.x
但它應該與Angular2 OnPush
。
如果你可以觀察一個集合
List myList = toObservable([]);
您可以訂閱更改
myList.changes.listen((record) {
// invoke Angular change detection
});
當類擴展Observable
(直接或通過應用Observable
mixin)
class Monster extends Unit with Observable {
@observable int health = 100;
void damage(int amount) {
print('$this takes $amount damage!');
health -= amount;
}
toString() => 'Monster with $health hit points';
}
您還可以訂閱更改並通知Angular
var obj = new Monster();
obj.changes.listen((records) {
// invoke Angular change detection
});
注意:如果您有一個帶有可觀察類實例的可觀察集合,則需要單獨監聽集合和包含類。 該集合僅報告添加和刪除,但不報告包含項目的屬性更改。
與Dart Stream有明顯不同的Observable嗎? ...
我認為Dart Observable
與Stream
有意義不同。 someObservable.changes
返回一個發出更改的Stream
,但更改事件由Observable
實現和變換器生成,該變換器從屬性上的@observable
注釋生成其他代碼。
除了收到有關未來更新的通知之外,Observable還特別支持獲取當前值嗎?
綁定到observable的屬性時,將獲得當前值。 當值更改並且changes
訂閱通知有關這些更改並且您通知Angular更改檢測已發生更改時,Angular將更新綁定到最近的值。
聲明組件的Observable String屬性的最小語法,
上面的代碼示例顯示了一個int
屬性,但使用String
時沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.