Я использую нокаут в моем проекте. У меня проблема со следующим кодом:
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);
Есть идеи??
__proto__
для созданного объекта - будет экземпляр viewModel. Object.create
создает новый объект с данным объектом в качестве прототипа. См. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create Конечно, это копирование объекта. Вы говорите ему, чтобы скопировать viewmodel
, который является тем же объектом, с которым вы привязываетесь. Если вам нужна новая копия для каждого, вам нужно сохранить исходную копию свежей. Самый простой способ сделать это - изменить следующую строку
self.types = ko.observableArray([Object.create(viewModel)]);
Теперь первый, помещенный в массив, является копией, и функция добавления продолжит копировать оригинал, а не тот, с которым вы привязываетесь. Смотрите здесь в действии.
Вы пытаетесь создать новый экземпляр объекта внутри себя. 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());
}