Почему Object.create не создает новый объект в JavaScript

0

Я использую нокаут в моем проекте. У меня проблема со следующим кодом:

var viewModel = ko.mapping.fromJSON('@Html.Raw(Json.Encode(Model))');

        function viewModelCollection() {
            var self = this;

            self.types = ko.observableArray([viewModel]);

            self.add = function () {
                //issue is here, the copy of viewModel object is adding
                //here, instead of new object.
                self.types.push(Object.create(viewModel));
            };

            self.remove = function () {
                self.types.remove(this);
            };
        }

        ko.applyBindings(new viewModelCollection());

Здесь я получаю пустой объект от сервера через плагин отображения. Я создаю новый объект viewModel. Я также создал viewModelCollection, которые имеют и наблюдают функцию viewModel и функцию, управляемую этим массивом.

Проблема в том, что когда я добавляю новый объект в функцию добавления, он не добавляет новый объект, а копирует объект. Поэтому, если я изменяю значение в одном текстовом поле, оно изменяется во всех текстовых блоках.

Почему эта строка не создает новый объект:

Object.create(viewModel);

Есть идеи??

Теги:
knockout.js

3 ответа

0
  1. Какая разница между вашим приложением между копией объекта и новым экземпляром объекта?
  2. Почему вы думаете, что это не работает? Проверьте поле __proto__ для созданного объекта - будет экземпляр viewModel. Object.create создает новый объект с данным объектом в качестве прототипа. См. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
0

Конечно, это копирование объекта. Вы говорите ему, чтобы скопировать viewmodel, который является тем же объектом, с которым вы привязываетесь. Если вам нужна новая копия для каждого, вам нужно сохранить исходную копию свежей. Самый простой способ сделать это - изменить следующую строку

self.types = ko.observableArray([Object.create(viewModel)]);

Теперь первый, помещенный в массив, является копией, и функция добавления продолжит копировать оригинал, а не тот, с которым вы привязываетесь. Смотрите здесь в действии.

0

Вы пытаетесь создать новый экземпляр объекта внутри себя. self.add - это переменная, которая оценивает себя, которая не является анонимной функцией, поэтому ее оценивают до того, как viewModel полностью инстанцируется. В этот момент, если вы console.log(viewModel), он вернет значение null или undefined.

Это будет способ использования анонимных функций для создания экземпляров модели представления внутри другой модели представления

function viewModel() {
    var self = this;
    var something = ko.observable();
}

function parentviewModel() {
    var self = this;
    var types = ko.observableArray();
    types.push(Object.create(viewModel));
    types.push(new viewModel());
}

Но это не сработает

var viewModel = function() {
    var self = this;
    var types = ko.observableArray();
    types.push(Object.create(viewModel));
    types.push(new viewModel());
}
  • 0
    пожалуйста, проверьте мой вопрос еще раз, я думаю, что вы не поняли
  • 0
    Нет, вы неправильно понимаете разницу между анонимной функцией и переменной.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню