#javascript #angular #typescript #object #angular6
#javascript #angular #typescript #объект #angular6
Вопрос:
Я создал сервис для обмена данными с несколькими компонентами. в конце концов, процесс завершен, и мне нужно сбросить значения объекта service. итак, я попробовал this.UserDetails = {};
, он очищает значение и удаляет вложенный объект. просто сбросьте значение по умолчанию, назначенное как сервис.
Спасибо.
служебный файл
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class dataService {
constructor() { }
UserDetails: any = {
key1 : '' ,
key2: {
Status: false,
Label: ''
},
key3: {
Status: false,
Label: ''
},
key4: {
Status: false,
Label: ''
},
key5: '',
key6: '',
key7: new Date(),
}
}
После присвоения значения в компонентах это выглядит так
UserDetails = {
key1 : 'value 1' ,
key2: {
Status: true,
Label: 'label 1'
},
key3: {
Status: false,
Label: 'label 2'
},
key4: {
Status: true,
Label: 'label 3'
},
key5: 'key value 1',
key6: 'key value 2',
key7: new Date(),
}
}
как только я передал данные в серверную часть, мне нужно сбросить значение по умолчанию в служебном файле
Комментарии:
1. Является ли вложенный объект фиксированным или динамическим?
2. @Kishan статический, и у меня много полей вложенных объектов.
3. Итак, просто для уточнения — вы хотите удалить все прямые свойства, которые не являются объектами (
key1
,key5
,key6
,key7
)? И вы хотите сохранить только свойства объекта ({}
)?4. Есть много способов изменить. Как вы ожидаете, что различные свойства будут выглядеть после сброса.
5. @RaviKumar Пожалуйста, добавьте ожидаемый результат.
Ответ №1:
Почему бы вам не создать UserDetails
класс и не заполнить его данными. Во время сброса просто верните новый экземпляр класса.
Пожалуйста, смотрите фрагмент ниже для демонстрации, я использовал классы ES6 для объяснения концепции, но вы можете распространить это на Angular.
class UserDetails {
key1 = '';
key2 = {
Status: false,
Label: ''
};
key3 = {
Status: false,
Label: ''
};
key4 = {
Status: false,
Label: ''
};
key5 = '';
key6 = '';
key7 = new Date();
}
class MyService {
userDetails;
constructor(){
this.userDetails = new UserDetails();
}
populate(){
this.userDetails.key1 ="foo"
this.userDetails.key2 = {
Status: true,
Label: 'bar'
};
return this.userDetails;
}
reset(){
this.userDetails = new UserDetails();
return this.userDetails;
}
}
let service = new MyService();
console.log(service.populate());
console.log("***********Resetting************");
console.log(service.reset());
Ответ №2:
Основываясь на том, что, я полагаю, вы хотите сделать, вы можете просто проверить, не является ли тип каждого дочернего элемента object
:
var UserDetails = {
key1: '',
key2: {
Status: false,
Label: ''
},
key3: {
Status: false,
Label: ''
},
key4: {
Status: false,
Label: ''
},
key5: '',
key6: '',
key7: new Date(),
};
Object.entries(UserDetails).forEach(([key, value]) => {
if (typeof value != "object") {
delete UserDetails[key];
}
});
console.log(UserDetails);
Комментарии:
1. OP очень неясен в требовании, в моем ответе я просто сохраняю структуру объекта, только очищая значения ключей.
2. Да @AmardeepBhowmick — это то, что, я полагаю , хочет OP, однако есть множество других возможностей.
Ответ №3:
Вы можете использовать reduce
. Установите ключи, значения которых не являются объектом или они являются экземпляром Date
, в пустую строку.
const input = {
key1 : '' ,
key2: {
Status: false,
Label: ''
},
key3: {
Status: false,
Label: ''
},
key4: {
Status: false,
Label: ''
},
key5: '',
key6: '',
key7: new Date(),
}
const output = Object.entries(input).reduce((accu, [key, val]) => {
if(typeof val != 'object' || input[key] instanceof Date) {
accu[key] = "";
} else {
accu[key] = val;
}
return accu;
}, {});
console.log(output)
Ответ №4:
Вы можете сделать либо то, что предложил Амардип Бховмик, либо вы также можете создать простую функцию в своем сервисе, которая возвращает тот же объект. Есть функция, подобная этой
private getUserDetailsObject():any{
var userDetailsObject = {
key1 : '' ,
key2: {
Status: false,
Label: ''
},
key3: {
Status: false,
Label: ''
},
key4: {
Status: false,
Label: ''
},
key5: '',
key6: '',
key7: new Date(),
}
return userDetailsObject;
}
Когда вы хотите сбросить объект, вы можете просто использовать this.UserDetails = this.getUserDetailsObject();
Вы можете использовать то же самое даже для инициализации вашего объекта в самый первый раз.
Комментарии:
1. спасибо за ответ, я только что попробовал один из них, но я не могу назначить значение и доступ в другом компоненте.