簡體   English   中英

使用Dart中的observable進行Angular2變化檢測

[英]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 ObservableStream有意義不同。 someObservable.changes返回一個發出更改的Stream ,但更改事件由Observable實現和變換器生成,該變換器從屬性上的@observable注釋生成其他代碼。

除了收到有關未來更新的通知之外,Observable還特別支持獲取當前值嗎?

綁定到observable的屬性時,將獲得當前值。 當值更改並且changes訂閱通知有關這些更改並且您通知Angular更改檢測已發生更改時,Angular將更新綁定到最近的值。

聲明組件的Observable String屬性的最小語法,

上面的代碼示例顯示了一個int屬性,但使用String時沒有區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM