1

我正在尝试创建一个网页,其中一些元素(表单和按钮)在单击其他元素(按钮)时变得可见或被隐藏。
我试图找到一种方法来管理它,即可重用且易于维护。

我目前的解决方案如下所示,但我希望有人有更优雅的解决方案。
我自己的解决方案的问题是,当依赖的数量增加时,它会变得难以阅读。当我添加另一个按钮和表单时,它也需要大量编辑。


我目前的解决方案是使用 observable 来管理表单的状态,如下所示:

HTML:

  <button id="button-A">Show form A, hide button A and B</button>
  <button id="button-B">Show form B, hide button A and B</button>
  <form id="form-A">
    ...this form is initially hidden
    ...some form elements
    <button id="cancel-A">Hide form A, show button A and B</button>
  </form>
  <form id="form-B">
    ...this form is initially hidden
    ...some form elements
    <button id="cancel-B">Hide form B, show button A and B</button>
  </form>

镖:

  import 'dart:html';
  import 'package:observe/observe.dart';

  final $ = querySelector;
  final $$ = querySelectorAll;

  Map<String, bool> toBeObserved = {
    "showFormA" : false,
    "showFormB" : false
  };

  // make an observable map
  ObservableMap observeThis = toObservable(toBeObserved);

  // start managing dependencies
  main() {
    // add click event to buttons
    $('#button-A')
    ..onClick.listen((E) => observeThis["showFormA"] = true);
    $('#button-B')
    ..onClick.listen((E) => observeThis["showFormB"] = true);

    // add click events to form buttons
    $('#cancel-A')
    ..onClick.listen((E) {
      E.preventDefault();
      E.stopPropagation();
      observeThis["showFormA"] = false;
    });
    $('#cancel-B')
    ..onClick.listen((E) {
      E.preventDefault();
      E.stopPropagation();
      observeThis["showFormB"] = false;
    });

    // listen for changes
    observeThis.changes.listen((L) {

      L.where((E) => E.key == 'showFormA').forEach((R) {
        $('#form-A').style.display = (R.newValue) ? 'block' : 'none';
        $('#button-A').style.display = (R.newValue || observeThis['showFormB']) ? 'none' : 'inline-block';
        $('#button-B').style.display = (R.newValue || observeThis['showFormB']) ? 'none' : 'inline-block';
      });
      L.where((E) => E.key == 'showFormB').forEach((R) {
        $('#form-B').style.display = (R.newValue) ? 'block' : 'none';
        $('#button-A').style.display = (R.newValue || observeThis['showFormA']) ? 'none' : 'inline-block';
        $('#button-B').style.display = (R.newValue || observeThis['showFormA']) ? 'none' : 'inline-block';
      });

    });
  }
4

3 回答 3

4

您可以使用基本 CSS 来显示/隐藏元素。

HTML

<div id="container" class="show-buttons">
    <button id="button-A" class="btn" data-group="a">...</button>
    <button id="button-B" class="btn" data-group="b">...</button>
    <form id="form-A" class="form group-a">...</button>
    <form id="form-B" class="form group-b">...</button>
</div>

CSS

.btn, .form {
  display: none;
}

.show-buttons .btn,
.show-a .form.group-a,
.show-b .form.group-b {
  display: block;
}

在 Dart 中,只需data-group从按钮中获取(或任何你想调用的)属性。切换元素上的 CSS 类(show-buttonsshow-ashow-bcontainer在按钮和特定表单之间切换。

这个解决方案很容易扩展。

于 2014-01-06T11:01:44.077 回答
2

您可以使用这样的东西以通用方式处理所有元素:

final Iterable<ButtonElement> buttons = querySelectorAll('button')
    .where((ButtonElement b) => b.id.startsWith('button-'));

final Iterable<ButtonElement> cancels = querySelectorAll('button')
    .where((ButtonElement b) => b.id.startsWith('cancel-'));

final Iterable<FormElement> forms = querySelectorAll('form')
    .where((FormElement b) => b.id.startsWith('form-'));

buttons.forEach((b) {
  b.onClick.listen((e) {
    // name of clicked button
    final name = b.id.substring(b.id.indexOf('-') + 1);
    // hide all buttons
    buttons.forEach((b) => b.hidden = true)
    // show the good form
    querySelector('#form-$name').hidden = false;
  });
});

cancels.forEach((b) {
  b.onClick.listen((e) {
    // show all buttons
    buttons.forEach((b) => b.hidden = false);
    // hide all forms
    forms.forEach((b) => b.hidden = true);
    // prevent default
    e.preventDefault();
  });
});

// hide all form at startup
forms.forEach((f) => f.hidden = true);
于 2014-01-06T10:09:57.297 回答
1

您可以使用聚合物的模板功能,例如

<template if="showA">...

这应该可以在不将您的元素嵌入到 Polymer 元素中的情况下工作。
这个讨论提供了一些如何在<template>没有 Polymer 元素的情况下使用的信息。使用 Polymer 元素也很有用。
这完全取决于您的要求/偏好。

Angular.dart 对于这种视图操作也很有用。

如果您想使用普通的 Dart/HMTL,我不知道如何简化您的代码。

于 2014-01-06T09:34:10.340 回答