2016-09-17 2 views
4

Пожалуйста, исправьте меня, если я ошибаюсь, но в настоящее время это невозможно с помощью замены, поскольку замена заменит весь наблюдаемый массив, и вместо этого следует использовать карту?MobX - Замена элемента в наблюдаемом массиве?

У меня есть наблюдаемый массив как это:

@observable questionsList = []; 

На сервере вызова он получает заполняется с 2-мя объектами, каждый с отдельной id поля, поэтому он будет выглядеть следующим образом:

@observable questionsList = [ 
          {id: 1, 
           question: "Is the earth flats?", 
           answer: "Some long answer here..." 
          {id: 2, 
           question: "Does the moon have life?"} 
           answer: "Some long answer here..."} 
          ]; 

Таким образом, вопрос с id of 1 имеет типографскую окантовку, требующую фиксации, должен быть Is the earth flat?

Да, обязательно необходимо знать:

const newQuestionId = 1; 
const newQuestion = "Is the earth flat?" 
const oldQuestion = this.questionsList.find(question => question.id === newQuestionId); 
oldQuestion.replace(newQuestion) // Would be nice if this syntax worked 

Теперь у меня есть правильный oldQuestion, но как я могу заменить его в questionList массив с новым вопросом? Я попытался заменить, но это не сработало. Является ли карта единственным способом? Если это так, я не уверен, как заставить карту работать, поскольку я работал только с наблюдаемыми массивами.

Как это сделать с помощью MobX?

+1

может быть что-то не хватает, но почему бы не просто: 'questionsList.find (вопрос => question.id === ID) .question =«Is земля плоская "? – mweststrate

ответ

4

Каждое свойство наблюдаемого объекта, в свою очередь можно было наблюдать, так что вы можете просто переписать строку:

const newQuestionId = 1; 
const newQuestion = "Is the earth flat?" 
const oldQuestion = this.questionsList.find(q => q.id === newQuestionId); 
oldQuestion.question = newQuestion; 

Если у вас есть дополнительные поля в новом объекте вопрос, который вы хотели бы использовать вместо этого, и сделать эти новые поля наблюдаемы, а также, вы можете использовать extendObservable:

const oldQuestion = this.questionsList.find(q => q.id === newQuestionId); 
extendObservable(oldQuestion, newQuestionObject); 
+0

Привет, Толл, да, это будет работать и решать это просто. Но основная проблема заключается в том, что я отправляю обратно новый обновленный объект 'newQuestion' с сервера (например, с 10 дополнительными полями) поверх полей вопрос/ответ выше, я хочу перезаписать весь объект' oldQuestion', а не перечисляя каждое конкретное свойство объекта 'question' и переписывая его один за другим. В основном делайте это навалом, замените/перезапишите весь объект 'question' с помощью соответствующего' id' '1' Как я могу это сделать? – Wonka

+0

@Wonka Gotcha. Обновлен ответ. – Tholle

+1

Спасибо. Прекрасно работает! – Wonka

Смежные вопросы