Создайте новый массив KO.observable и заполните его из объекта массива

Можно ли создать массив ko.observable и заполнить его с помощью объекта массива?

Моя цель здесь - создать массив ko.observable со всем описанием / объектами, которые есть в исходном массиве.

//Sample data the original data is coming from an socket query and being push on the array("people")
var people = [{
    name: "Contact 1",
    address: "1, a street, a town, a city, AB12 3CD",
    tel: "0123456789",
    email: "[email protected]",
    type: "family"
  },
  {
    name: "Contact 2",
    address: "1, a street, a town, a city, AB12 3CD",
    tel: "0123456789",
    email: "[email protected]",
    type: "friend"
  }
];.

var people = [{
    name: "Contact 1",
    address: "1, a street, a town, a city, AB12 3CD",
    tel: "0123456789",
    email: "[email protected]",
    type: "family"
  },
  {
    name: "Contact 2",
    address: "1, a street, a town, a city, AB12 3CD",
    tel: "0123456789",
    email: "[email protected]",
    type: "friend"
  }
];

var quotesarray = function(items) {
  this.items = ko.observableArray(items);
  this.itemToAdd = ko.observable("");
  this.addItem = function() {
    if (this.itemToAdd() != "") {
      this.items.push(this.itemToAdd());
      this.itemToAdd("");
    }
  }.bind(this);
};
ko.applyBindings(new quotesarray(people));

console.info(people);

в значительной степени ты можешь это сделать, в чем проблема?

super cool 20.07.2018 07:06

@supercool результат не определен

Joemar Zeta 20.07.2018 07:17

не могли бы вы оставить код в скрипке и показать ошибку, я могу помочь вам исправить ее.

super cool 20.07.2018 07:26

@supercool jsfiddle.net/zo8ygfk4/4 здесь я просто сделаю простой

Joemar Zeta 20.07.2018 07:35

вы должны пройти через элемент (jsfiddle.net/zo8ygfk4/7). ko.applyBindings принимает 1-й параметр как viewModel. поскольку вы не упомянули ни одного параметра в секунду, по умолчанию он принимает документ.

super cool 20.07.2018 08:26

@supercool, это работает со статическим массивом, но не работает с моим кодом, так как он исходит из сокета. Я всегда сталкиваюсь с этой ошибкой неперехваченной ошибки: вы не можете применять привязки несколько раз к одному и тому же элементу.

Joemar Zeta 20.07.2018 10:32

ну, вам не следует вызывать привязки Apply несколько раз, пока необходимость в них не отпадет. можно попробовать так jsfiddle.net/zo8ygfk4/17. Надеюсь, поможет

super cool 20.07.2018 12:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
387
2

Ответы 2

Просто нужно было сделать items вместо quotesarray

var people = [
    { name: "Contact 1", address: "1, a street, a town, a city, AB12 3CD", tel: "0123456789", email: "[email protected]", type: "family" },
    { name: "Contact 2", address: "1, a street, a town, a city, AB12 3CD", tel: "0123456789", email: "[email protected]", type: "friend" }
];


var quotesarray = function(items){
    this.items = ko.observableArray(items);
    this.itemToAdd = ko.observable("");
    this.addItem = function(){
        if (this.itemToAdd() != ""){
            this.items.push(this.itemToAdd());
            this.itemToAdd("");
        }
    }.bind(this);
};
ko.applyBindings(new quotesarray(people));

console.info(people);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<table>
    <thead>
        <tr><th>name</th><th>address</th></tr>
    </thead>
    <tbody data-bind = "foreach: items">
        <tr>
            <td data-bind = "text: name"></td>
            <td data-bind = "text: address"></td>
        </tr>
    </tbody>
</table>

Спасибо, но это работает со статическим массивом, но не работает с моим кодом, так как он исходит из сокета. Я всегда сталкиваюсь с этой ошибкой. Неперехваченная ошибка: вы не можете применять привязки несколько раз к одному и тому же элементу.

Joemar Zeta 20.07.2018 10:33

Вы можете создать observableArray, на который сокет будет записывать сообщения. Вы subscribe в массив, чтобы получать автоматические уведомления при изменении содержимого (т.е. после каждой записи сокетом).

В обратном вызове subscribe вы очищаете массив и добавляете элементы в свойство вашей модели просмотра.

Если вы ожидаете получить много быстро следующих друг за другом сообщений, вы можете rateLimit массив, в который вы записываете, чтобы гарантировать, что вы не обновляете DOM слишком много раз.

Вот пример. Пояснения в комментариях к коду.

const UPDATE_EVERY_MS = 500;

// The observable array the socket writes to
const received = ko.observableArray([])
  // Use a rateLimit extension if you expect to
  // receive many updates from your socket
  .extend({ rateLimit: UPDATE_EVERY_MS });
  
// The observable array in your viewmodel
const rendered = ko.observableArray([]);

received.subscribe(items => {
  // Write "inbox" to viewmodel's list
  rendered(rendered().concat(items));
  
  // Clear received without triggering notification
  items.length = 0;
});

ko.applyBindings({ items: rendered });


// Mock a socket that writes to `received`
setInterval(() => received.push(Math.random()), 200);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<ul data-bind = "foreach: rendered">
  <li data-bind = "text: $data"></li>
</ul>

Другие вопросы по теме