2013-05-27 4 views
2

제가 건물에있는 작은 응용 프로그램이 예 here과 매우 비슷합니다. 내가 Dart SDK version 0.5.9.0_r22879Dart에서 watchers.dispatch()를 호출해야하는 시점은 언제입니까?

의 주요 차이점을 사용하고

는 내가 AJAX 요청을 통해 결과를 업데이트하고, 내 입력 제어를 눌렀을 때 입력 I는이 요청을 할 것입니다.

두 번째 예제 here에서 설명한대로 내 코드에서 명시 적으로 watchers.dispatch()을 호출하지 않으면 결과 목록이 렌더링되지 않습니다.

왜? watchers.dispatch()을 명시 적으로 호출해야하는시기와 템플릿 예제 에서처럼 자동으로 발생해야하는시기는 명확하지 않습니다.

내 HTML : myapp.dart의

<!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> 

중요한 부분 :

당신이 트리거되지 않는 방식으로 모델을 변경해야 할 때마다 명시 적으로 watchers.dispatch()를 호출 할 필요가
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

템플릿에 의해 시작된 이벤트. 예, 타이머 등에서 AJAX 호출을 의미합니다.

템플릿으로 설치된 이벤트는 dispatch()을 호출하므로이 경우 호출하지 않아도됩니다.

자세한 내용은 here에서 확인할 수 있습니다.

그러나 Web-UI의 목표 중 하나 인 Observables를 더 많이 선언하는 것이 바로 watchers.dispatch으로 'old way'로 취급됩니다. 그래서 미래 보장 솔루션은 모델에 @observable 주석을 사용하는 것입니다. 이렇게하면 명시 적으로 업데이트 할 필요없이 모델이 변경 될 때마다 관찰자가 업데이트됩니다.