2013-05-27 31 views
2

我有一個非常類似於示例here的小型應用程序。何時需要在Dart中調用watchers.dispatch()?

我使用Dart SDK version 0.5.9.0_r22879

的主要區別是,我更新通過Ajax請求的結果,在我的輸入控制被按下時,輸入我只是提出這個要求。

在我的代碼中,除非我明確地調用watchers.dispatch(),否則結果列表不會呈現,如第2個示例here中所述。

爲什麼?我不清楚何時必須明確地撥打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']; 
} 

回答

4

你需要調用watchers.dispatch()明確每當你需要改變模型,其中沒有被觸發的方式由模板觸發的事件。這意味着您的示例中的AJAX調用,定時器等。

模板安裝的事件負責爲您調用dispatch(),因此您不必在此情況下執行此操作。

你可以找到更多關於這個here

但是,此刻,watchers.dispatch被視爲'舊的方式',因爲Web-UI中的目標之一是使綁定更具聲明性,可觀察性更強。因此,面向未來的解決方案是在您的模型上使用@observable註釋。這將確保每當模型更改時觀察員都會更新,而不需要您明確更新它們。

相關問題