Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在订阅中更改的angular 4@Input参数不会更新视图_Angular - Fatal编程技术网

在订阅中更改的angular 4@Input参数不会更新视图

在订阅中更改的angular 4@Input参数不会更新视图,angular,Angular,我有一个select组件,我将其参数设置为: <app-select-v2 [formGroup]="model" [controlName]="'owner'" [options]="ownerOptions" [label]="'Select task\'s owner'" [width]="'100%'" [height]="'30rem'" [scrollFrom]="5" ></app-select-v2> ownerOptions

我有一个select组件,我将其参数设置为:

<app-select-v2
  [formGroup]="model"
  [controlName]="'owner'"
  [options]="ownerOptions"
  [label]="'Select task\'s owner'"
  [width]="'100%'"
  [height]="'30rem'"
  [scrollFrom]="5"
></app-select-v2>
ownerOptions:Option[] = [
    {name: 'name1', value: 'value1'},
    {name: 'name2', value: 'value2'}
    ...
];
首先,这是一个空数组,我想用数据填充它。函数的作用是:假设填充什么。我称之为ngOnInit()

setOwnerOptions(){
此._calendar.getActiveUsers().subscribe((名称:string[])=>{
对于(变量i:number=0;i{
_option.name=全名;
_option.value=名称[i];
this.ownerOptions.push(_选项);
});
}
});
}
(我知道这不是从api获取id(name)和全名的最佳方式。我很快会重写这部分。)getActiveUsers()和getUserFullName(name:string)函数工作正常。我从api获取请求的数据,循环将其推送到ownerOptions数组。但问题是视图没有更新,在订阅之外,ownerOptions仍然是一个空数组,因为angular没有注意到更改。 有人能帮我吗?我在这方面有一定的经验:/ (我试图创建一个区域并使用changeRef运行脚本,但对我来说效果相同。)


感谢您的回答和时间:)

在您的子组件中实施
OnChanges

export class SelectV2 implements OnInit, OnChanges {
  // ...
  ngOnChanges(change: SimpleChange) {
    console.log(change);
  }
}

每次
输入
的值更改时,都会触发此方法

在子组件中实现
OnChanges

export class SelectV2 implements OnInit, OnChanges {
  // ...
  ngOnChanges(change: SimpleChange) {
    console.log(change);
  }
}
每次
输入
的值更改时,都会触发此方法

问题在于:

_option.value = names[i];
此时,所有订阅的
i
等于
names.length-1
。这确实不是最好的代码,但是很难看到您真正想要实现什么,所以要解决您的问题,您可以将其更改为此。通过使用
forEach
循环,可以防止此问题:

setOwnerOptions(){ 
  this._calendar.getActiveUsers().subscribe(names => {
    names.forEach(name => 
      this._calendar.getUserFullName(name).subscribe(fullname => {
        let option = new Option();
        option.name = fullname;
        option.value = name;
        this.ownerOptions.push(_option);
    })
  })
}
不完全确定,但我相信您也可以在
for循环
中使用
let
关键字,而不是
var
来修复它。实际上,你不应该使用
var
关键字,除非你真的知道自己在做什么,即使你知道不使用它

问题在于:

_option.value = names[i];
此时,所有订阅的
i
等于
names.length-1
。这确实不是最好的代码,但是很难看到您真正想要实现什么,所以要解决您的问题,您可以将其更改为此。通过使用
forEach
循环,可以防止此问题:

setOwnerOptions(){ 
  this._calendar.getActiveUsers().subscribe(names => {
    names.forEach(name => 
      this._calendar.getUserFullName(name).subscribe(fullname => {
        let option = new Option();
        option.name = fullname;
        option.value = name;
        this.ownerOptions.push(_option);
    })
  })
}

不完全确定,但我相信您也可以在
for循环
中使用
let
关键字,而不是
var
来修复它。事实上,除非您真的知道自己在做什么,并且知道不使用它,否则您不应该使用
var
关键字。请尝试将项目推送到本地数组,然后设置此项。ownerOptions=myArray

尝试将项目推送到本地数组,然后设置此项。ownerOptions=myArray