2

ここにある例と非常によく似た小さなアプリケーションを構築しています。

私は使っているDart SDK version 0.5.9.0_r22879

主な違いは、AJAX 要求を介して結果を更新し、入力コントロールで Enter キーが押されたときにのみこの要求を行うことです。

私のコードでは、こちらwatchers.dispatch()の 2 番目の例で説明されているように、明示的に を呼び出さない限り、結果リストはレンダリングされません。

なんで?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

1 に答える 1

4

watchers.dispatch()テンプレートによって起動されたイベントによってトリガーされない方法でモデルを変更する必要があるときはいつでも、明示的に呼び出す必要があります。これは、あなたの例、タイマーなどのような AJAX 呼び出しを意味します。

テンプレートによってインストールされたイベントが呼び出しdispatch()を処理するので、その場合は実行する必要はありません。

詳細については、こちらをご覧ください。

ただし、Web-UI の目標の 1 つは、Observable を使用してバインドをより宣言的にすることであるため、現時点でwatchers.dispatchは「古い方法」として扱われます。したがって、将来の解決策は@observable、モデルで注釈を使用することです。これにより、明示的に更新する必要なく、モデルが変更されるたびにオブザーバーが確実に更新されます。

于 2013-05-27T08:05:27.630 に答える