Angular6:自定义组件上的输入绑定(bind)未正确更新

标签 angular typescript data-binding angular6

StackOverflow 上的第一个问题,多么令人兴奋!

目前我有两个自定义组件,都接受几个输入变量:

<sod-matrix-table #matrix 
  [entities]="entities" 
  [pairs]="pairs" 
  [displayedColumns]="displayedColumns">
</sod-matrix-table>

和:

<data-table 
  #table 
  [type]="sodMatrixQuery.targetType" 
  [query]="sodMatrixQuery" >
</data-table>

更新第一个标签的entitiespairscolumns 时,一切都会正确更新。例如,当我在使用矩阵表标记的组件中更新 displayedColumns 数组时,该组件内的表会更新为所需的列。
但是,当我更新组件中的 sodMatrixQuery 并按下搜索按钮时,data-tablequery 对象没有更新正确,尽管它们绑定(bind)在一起。

例子:

data-table 有一个字段 query 并使用此查询向服务器发送 REST 请求。 SODMatrixComponent 有一个字段 sodMatrixQuery 并使用 data-table 的标签,将他的字段绑定(bind)到另一个字段。

SOD 矩阵包含成对的对象。当我选择 2 对并按下搜索按钮时,data-table 发送包含 2 对的 REST 请求。但是,当我删除这两对并再次按搜索时,data-table 组件发送另一个 REST 请求,同样有 2 对而不是没有。第二次按下搜索按钮时,将发送正确的请求。

我进行了调试,在内部,所有与配对的东西都很好,只是数据绑定(bind)没有及时更新。对此有什么想法吗?

编辑:这是点击按钮时发生的代码:

public search() {
    const tempQuery = new SODMatrixQuery(this.lhsType, this.rhsType, [], this.entities);

    // Only look at elements above the diagonal
    for (let i = 1; i < this.pairs.length; i++) {
        for (let j = 0; j < i; j++ ) {
            const p = this.pairs[i][j];
            if (p.checked) {
                tempQuery.addToxicPair(p);
            }
        }
    }

    if (this.dataTable) {
        this.sodMatrixQuery = tempQuery;
        // this.dataTable.query = tempQuery;
        this.dataTable.loadDataPage();
    }

}

SODMatrixComponent 变量:

@ViewChild("table")
public dataTable: ElimityDataTableComponent;

public sodMatrixQuery: SODMatrixQuery;

数据表组件:

@Input()
public query: Query;

SODMatrixQuery 扩展查询!

下面的注释行是一个修复,直接更新查询对象,但我只是好奇为什么数据绑定(bind)不起作用。

最佳答案

看起来变化检测需要一点时间来喘息——数据绑定(bind)不能在 sodMatrixQuery 的设置之间更新。成员(member)和this.dataTable.loadDataPage() call - 这就是为什么它在第一次调用时仍然具有旧值的原因。之后将运行更改检测,并且在第二次调用时它将具有正确的值。

if (this.dataTable) {
    this.sodMatrixQuery = tempQuery;
    // can't update the bindings here
    this.dataTable.loadDataPage();
}

所以看看你现在的架构,最好把loadDataPage()移走在 OnChanges 中调用 dataTable 组件生命周期钩子(Hook),就像 Agash 在评论中所说的那样。

export class ElimityDataTableComponent implements OnChanges {
  // ...
  ngOnChanges(changes: SimpleChanges) {
    if (changes.query) {
      this.loadDataPage();
    }
  }

这样,每次更新sodMatrixQuery , 它会自动加载新数据。

关于Angular6:自定义组件上的输入绑定(bind)未正确更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51782152/

相关文章:

angular - map 在 Angular RxJ 中不起作用

javascript - 如何合并 mergeMap observables 调用并只为整个 observable 返回一个值

javascript - 如何使用 webpack 生成 d.ts 和 d.ts.map 文件?

.net - 将 TypeScript JS 输出作为资源嵌入到 DLL 中

javascript - 如何从 webpack 运行 Node main.js

Angular 6 延迟加载路线

angular - 禁止在 Nrwl Nx 中的同一库中导入桶文件

c# - 使用 MVVM 将命令绑定(bind)到 DataTemplate 中的控件

wpf - 在 WPF 中选择 ListViewItem 时启用 TextBox(数据绑定(bind))

silverlight - 使用 MVVM 模式绑定(bind)嵌套控件