[英]When do I need to call watchers.dispatch() in Dart?
我有一個正在構建的小應用程序,它與此處的示例非常相似。
我正在使用Dart SDK version 0.5.9.0_r22879
主要區別在於我通過AJAX請求更新結果,並且僅在輸入控件中按Enter時才發出此請求。
在我的代碼,結果列表中不會呈現,除非我明確地調用watchers.dispatch()
在第二個例子中討論這里 。
為什么? 尚不清楚何時必須顯式調用watchers.dispatch()
以及何時自動發生,如模板示例中所示。
我的HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My App</title>
<link rel="stylesheet" href="myapp.css">
</head>
<body>
<h1>My App</h1>
<div id="seach-box-container">
<input type="text" name="search-box" id="search-box" placeholder="Search" bind-value="searchText" />
</div>
<div id="results-container">
<template instantiate="if noMatches"><span>No matches</span></template>
<template instantiate="if !noMatches"><span>{{results.length}} entries:</span></template>
<div id="app-entries">
<ul>
<template iterate='entry in results'>
<li><pre>{{entry.message}}</pre></li>
</template>
</ul>
</div>
</div>
<script type="application/dart" src="myapp.dart"></script>
<script src="packages/browser/dart.js"></script>
</body>
</html>
myapp.dart的重要部分:
import 'dart:html';
import 'dart:json' as JSON;
import 'dart:uri' as uri;
import 'package:web_ui/web_ui.dart';
import 'package:web_ui/watcher.dart' as watchers;
String searchText = '';
List<LogEntry> results = [];
bool get noMatches => results.isEmpty;
void main() {
query("#search-box").onKeyPress.listen((e) => handleKeyPress(e));
}
void handleKeyPress(KeyboardEvent e) {
if (!e.ctrlKey && e.keyCode == KeyCode.ENTER) {
doSearch();
}
}
void doSearch() {
if (searchText != '') {
makeRequest();
}
}
void makeRequest() {
HttpRequest.getString( 'http://url.to/rest-api?q=$searchText' )
.then(processString)
.catchError(handleError)
;
}
processString(String jsonString) {
List<Map> logs = JSON.parse(jsonString);
results.clear();
results.addAll( logs.map((l) => new AppEntry.fromJson(l)) );
watchers.dispatch();
}
handleError(Error error) {
print('Request failed');
print(error);
}
class AppEntry {
final String message;
AppEntry.fromJson(Map json) : message = json['message'];
}
每當需要以不被模板觸發的事件觸發的方式更改模型時,就需要顯式調用watchers.dispatch()
。 這意味着像您的示例中的AJAX調用,計時器等。
模板安裝的事件將為您調用dispatch()
,因此在這種情況下您不必這樣做。
但是,目前, watchers.dispatch
被視為“舊方法”,因為Web-UI的目標之一是使可觀察對象的綁定更具聲明性。 因此,面向未來的解決方案是在模型上使用@observable
批注。 這將確保每次模型更改時都更新觀察者,而無需您顯式更新它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.