gpt4 book ai didi

dart - 我什么时候需要在 Dart 中调用 watchers.dispatch()?

转载 作者:行者123 更新时间:2023-12-03 02:51:53 25 4
gpt4 key购买 nike

我正在构建一个与示例 here 非常相似的小型应用程序。 .

我正在使用 Dart SDK version 0.5.9.0_r22879
主要区别在于我通过 AJAX 请求更新结果,并且仅当在输入控件中按下 Enter 时才发出此请求。

在我的代码中,除非我明确调用 watchers.dispatch(),否则结果列表不会呈现。 ,如第二个示例中所讨论的 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'];
}

最佳答案

您需要调用watchers.dispatch()每当您需要以不是由模板触发的事件触发的方式更改模型时,显式地更改模型。这意味着 AJAX 调用,如您的示例、计时器等。

由模板安装的事件负责调用 dispatch()为你,所以在这种情况下你不必这样做。

你可以找到更多关于这个here .

但是,目前,watchers.dispatch被视为“旧方式”,因为 Web-UI 的目标之一是使用 observables 使绑定(bind)更具声明性。因此,面向 future 的解决方案是使用 @observable 模型上的注释。这将确保每次模型更改时都会更新观察者,而无需您显式更新它们。

关于dart - 我什么时候需要在 Dart 中调用 watchers.dispatch()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com