Aurelia:如何跟踪是否加载了@children元素?

Aurelia:如何跟踪是否加载了@children元素?,aurelia,Aurelia,我有自定义选项卡功能,但在将Aurelia更新为rc-1.0.x之后,@childrendecorator中的列表数据出现了问题 我的代码看起来像: 从“aurelia框架”导入{inject,customElement,children} @customElement('tabs') @inject(Element) @children({name:'tabs', selector: "tab"}) export class Tabs { act

我有自定义选项卡功能,但在将Aurelia更新为rc-1.0.x之后,@childrendecorator中的列表数据出现了问题

我的代码看起来像: 从“aurelia框架”导入{inject,customElement,children}

    @customElement('tabs')
    @inject(Element)
    @children({name:'tabs', selector: "tab"})

    export class Tabs  {
      activeTab = undefined;

      constructor(element) {
        this.element = element;
      }

      attached() {
        console.log(this.tabs); // Return undefined on promise resolve!!!
        this.tabs.forEach(tab => {
          if (tab.active) {
            this.activeTab = tab;
          }

          tab.hide();
        });

        this.activeTab.show();

      }
在第一次加载时,一切都正常工作,这是一个项目数组,正如预期的那样

接下来,如果我执行一个服务器请求,当promise被解析时此选项卡控制台日志未定义

如果我设置超时,它会解决问题,但这是正确的方法吗

我还注意到在html中,执行了repeat.for语句,这给了我一个线索,即在处理附加函数之后,这个.tabs被延迟接收

html:

<template>
  <ul class="nav nav-tabs m-b-1">
    <li repeat.for="tab of tabs">
      <a href="#" click.trigger="$parent.onTabClick(tab)">
        ${tab.name & t}
      </a>
    </li>
  </ul>
  <slot></slot>
</template>


那么,有没有一种方法可以使用Aurelia bind或attached方法或其他更优雅的方法,而不是使用超时功能检查this.tabs的值呢?

我认为这对于任务队列来说可能是一个合适的用例(但如果有更了解情况的人不这么认为,请告诉我)。在从
附件
内部访问可绑定值时,我以前不得不使用任务队列,您的实例看起来基本相同(除了您使用
@children
访问它们)

TaskQueue将把您的逻辑推到处理堆栈的末尾。因此,理论上这意味着它将等待Aurelia完成其内部绑定逻辑和子装饰器解析,然后运行代码

可能有更好的解决方案,但我以前使用过它来摆脱我前面提到的类似情况,还没有找到更好的解决方案来解决问题,特别是在访问
附件中的动态值方面

import {TaskQueue} from 'aurelia-framework';

@customElement('tabs')
@inject(Element, TaskQueue)
@children({name:'tabs', selector: "tab"})

export class Tabs  {
  activeTab = undefined;

  constructor(element, taskQueue) {
    this.element = element;
    this.taskQueue = taskQueue;
  }

  attached() {
    this.taskQueue.queueMicroTask(() =>{
        this.tabs.forEach(tab => {
            if (tab.active) {
                this.activeTab = tab;
            }

            tab.hide();
         });

         this.activeTab.show();
    });
  }

在您的代码中承诺在哪里解析?选项卡是其他自定义元素的一部分。这个承诺在另一个核心文件中得到了解决,我们使用bindingEngine跟踪并更新该自定义元素的模型。您介意使用gist.run快速复制您的问题吗?我已经为您创建了一个基本设置,从这里开始:只需添加所需的代码,单击“Fork to Public Gist”,然后将链接作为注释发布。恐怕我不能这样做。请看,我从其他开发人员那里继承了代码,核心文件具有非常复杂的逻辑,因此要将其放在gist中并不容易。我重新组织选项卡的逻辑,使其在没有超时的情况下工作,但我认为这是Aurelia的问题。触发绑定或连接时,@children不会被解析。无论如何,谢谢你的支持,希望将来能解决这个问题。干杯谢谢你的回答!正如我所说的,我重构了逻辑,使这个功能更加简单。无论如何,您对taskQueue的介绍将帮助我解决另一个问题。我还想知道,是否有一个监听器可以在this.tabs被填充时进行检测,然后运行执行迭代的函数?可能是html中repeat.for属性使用的内容?