【问题标题】:How to write two-way binding in dart angular如何用飞镖角编写双向绑定
【发布时间】:2017-07-31 16:55:44
【问题描述】:

我需要一个组件来选择具有双向绑定的用户角色

角色选择器-comp.html

<div class="roleChooser">
  <role-item #owner (select)="role(owner.role)" [role]="'owner'" [title]="'Owner'"></role-item>
  <role-item #writer (select)="role(writer.role)" [role]="'writer'" [title]="'Writer'"></role-item>
  <role-item #viewer (select)="role(viewer.role)" [role]="'viewer'" [title]="'Reader'"></role-item>
</div>

它的类如下:

role-chooser-comp.dart

@Component(
    selector: 'role-chooser-comp',
    templateUrl: 'role_chooser_comp.html',
    styleUrls: const ['role_chooser_comp.css'],
    directives: const [RoleItem])
class RoleChooser implements OnInit {
  final PlaceService _placeService;
  final Router _router;
  final Environment _environment;

  @ViewChild('owner') RoleItem owner;
  @ViewChild('writer') RoleItem writer;
  @ViewChild('viewer') RoleItem viewer;
  List<RoleItem> choices;
  String lastSelected;

  RoleChooser(this._placeService, this._router, this._environment) {

  }

  Future<Null> ngOnInit() async {
    choices = [owner, writer, viewer];
    if (lastSelected != null)
      role(lastSelected);
  }

  String get selected => lastSelected;

  @Input()
  set selected(String role) {
    //on init, the choices are still not set
    if (choices == null)
      lastSelected = role;
    else
      this.role(role);
  }

  void role(String role) {
    if (choices == null) {
      window.alert("No roles are set");
      return;
    }

    for (RoleItem item in choices) {
      if (item.role == role) {
        item.selected = true;
        lastSelected = role;
      } else {
        item.selected = false;
      }
    }
  }
}

现在我需要的是能够自动更新模型的值,例如:

用例

<role-chooser-comp [(selected)]="userRole.roleName"></role-chooser-comp>

<role-chooser-comp [(ngModel)]="userRole.roleName"></role-chooser-comp>

我发现了一篇关于 angular.js 的文章,它展示了如何将 [(ngModel)] 与任何元素一起使用(实现了两种方法,因此 Angular 知道如何从组件中获取值并向后获取):https://docs.angularjs.org/guide/forms实现自定义表单控件(使用 ngModel)

我想在飞镖中做同样的事情,但我不知道如何......

角色项现在很简单,我只是粘贴它以供参考:

角色-item.html

<div class="role" [class.selected]="selected" (click)="clicked()">
      <btn #icon
          [sources]="images"></btn>
    </div>

角色项目.dart

import 'package:angular2/core.dart';
import 'package:angular2/router.dart';

import 'package:share_place/environment.dart';
import 'package:share_place/place_service.dart';

import 'package:share_place/common/ui/button_comp.dart';

@Component(
    selector: 'role-item',
    templateUrl: 'role_item.html',
    styleUrls: const ['role_item.css'],
    directives: const [ButtonComp])
class RoleItem {
  final PlaceService _placeService;
  final Router _router;
  final Environment _environment;
  @Output() final EventEmitter<String> pressAction = new EventEmitter<String>();
  @Output() final EventEmitter<String> select = new EventEmitter<String>();

  get role => itemRole;

  @Input() set role(String role) {
    itemRole = role;
    images = [
      '../images/roles/$role.png',
      '../images/roles/$role-h.png',
      '../images/roles/$role-c.png'
    ];
  }

  @Input() String title;
  @Input() String desc;

  @ViewChild('icon')
  ButtonComp icon;

  String itemRole;

  List<String> images;
  bool isSelected = false;

  bool toggle = false;

  RoleItem(this._placeService, this._router, this._environment);

  void clicked() {
    bool newlySelected;
    if (!isSelected)
      newlySelected = true;

    if (toggle)
      selected = !selected;
    else
      selected = true;

    pressAction.emit(role);
    if (newlySelected)
      select.emit(role);
  }

  bool get selected => isSelected;

  void set selected(bool isSelected) {
    this.isSelected = isSelected;
    icon.select(isSelected);
  }

}

【问题讨论】:

    标签: angular dart


    【解决方案1】:

    你需要添加

    @Output() EventEmitter<String> selectedChange = new EventEmitter<String>();
    

    到您的RoleChooser 组件。

    通知更改调用

    selectedChange.add('foo');
    

    然后userRole.roleName来自

    <role-chooser-comp [(selected)]="userRole.roleName"></role-chooser-comp>
    

    将会更新。

    【讨论】:

    • 哇!这对我来说太聪明了!它是如何工作的?它知道我想调用 userRole 的设置器(通过发出一个与我的 [(selected)] 值无关的事件???
    • [selected]="userRole.roleName"userRole.roleName 分配给selected,(selectedChange)="userRole.roleName = $event"` 分配另一个方向的更改。两者的简写是[(selected)]="userRole.roleName"。 Angular 每次运行变更检测时都会评估这些绑定。
    • 所以关键在命名?必须选择 @output 名称更改它才能工作?
    • 否,那么只能使用事件绑定(onSelect)="...",但不能使用值+事件绑定的简写。为此,输出必须与输入具有相同的名称,并带有额外的Change 后缀。
    • github.com/dart-lang/angular_analyzer_plugin 应该对此有所帮助。目前正在进行中,但如果你有匹配的 Dart 版本,你可以使用它,它已经很有帮助了。
    猜你喜欢
    • 2014-06-26
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2017-11-26
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多