По моему мнению, было бы лучше определить их всех в модели
. Вы начнете со следующей модели
params.model.ts
import {SomeOtherModel} from './some-other.model'
export interface ParamsModel {
paramName1: string;
paramName2?: string;
paramName3?: number;
paramName4: SomeOtherModel;
}
Тогдав вашем компоненте вы можете заставить свой ввод принимать определенный аргумент модели
my.component.ts
import {ParamsModel} from './params.model';
@Component({..})
class MyComponent {
@Input() params: ParamsModel;
}
app.component.html
<my-component params="paramsModel"></my-component>
app.component.ts
import {ParamsModel} from './params.model';
@Component({..})
class AppComponent implements OnInit {
paramsModel: ParamsModel;
ngOnInit(): void {
this.paramsModel = <ParamsModel>{someValue: someValue};
}
}
таким образом, у вас есть полное завершение кода.
, однако, обратите внимание!Angular не следит за содержимым, поэтому при изменении содержимого внутри объекта Params в javascript будет сохраняться тот же идентификатор объекта, в результате чего angular не увидит изменений.
Есть несколько способов обойти это
1: привязать каждый параметр (это именно то, что вам не нужно)
2: при изменении содержимого моделиуничтожить экземпляр и каждый раз создавать новый экземпляр. Это можно сделать, добавив в модель конструктор и преобразовав его в этот код
export class ParamsModel {
paramName1: string;
paramName2?: string;
paramName3?: number;
paramName4: SomeOtherModel;
constructor(config?: ParamsModel) {
Object.assign(this, config);
}
}
// first init
this.paramsModel = new ParamsModel(<ParamsModel>{someValue: someValue});
// updated init
this.paramsModel = new ParamsModel(this.paramsModel);
this.paramsModel.changedValue = changedValue; // (could also use an extend function on original params model)
3: создать наблюдателя с событиями и вызвать события обновления надругая сторона
4: используйте ngDoCheck, чтобы выполнить собственную проверку, изменилось ли содержимое