копировать только записываемые элементы из Knockout ViewModel - PullRequest
0 голосов
/ 16 сентября 2018

В моей ViewModel есть несколько элементов, включающих функции и наблюдаемые переменные. Но на момент публикации мне нужны только доступные для записи элементы.

var viewModel = {
    firstName: ko.observable().extend({ minLength: 2, maxLength: 10 }),
    lastName: ko.observable().extend({ required: true }),
    emailAddress: ko.observable(),
    age: ko.observable().extend({ min: 1, max: 100 }),
    options: ['News', 'Music'],
    subscription: ko.observable().extend({ required: true }),
    password: ko.observable(),
    submit: function () {
        var model = cloneObservable(viewModel);
    },
    reset: function () {
    }
};

ko.applyBindings(viewModel);

клон viewModel:

 function cloneObservable(viewModel) {
    var model = ko.observableArray([]);
    Object.keys(viewModel).forEach(function (name) {
        if (ko.isWritableObservable(viewModel[name])) {
            model.push(viewModel[name]);
        }
    })
    return ko.mapping.fromJS(ko.toJS(model));
 }

viewModel [имя] не возвращает наблюдаемую переменную.

1 Ответ

0 голосов
/ 16 сентября 2018

Вы должны получить экземпляр viewModel и использовать его в функции CloneObservable.

Я удалил ko.mapping.fromJS из функции, чтобы показать, что значения приходят правильно.

function cloneObservable(viewModel) {
  var model = ko.observableArray([]);
  Object.keys(viewModel).forEach(function (name) {
      if (ko.isWritableObservable(viewModel[name])) {
          model.push(viewModel[name]);
      }
  })
  return ko.toJS(model);
}


var viewModel = function(){
  var self = this;
  self.firstName = ko.observable('sal').extend({ minLength: 2, maxLength: 10 });
  self.lastName = ko.observable('mon').extend({ required: true });
  self.emailAddress = ko.observable('email');
  self.age = ko.observable(21).extend({ min: 1, max: 100 });
  self.options = ['News', 'Music'];
  self.subscription = ko.observable('yes').extend({ required: true });
  self.password = ko.observable('secret');
  self.submit = function(){
     
  };
  
};

var viewModelInstance = new viewModel();

ko.applyBindings(viewModelInstance);


console.log(cloneObservable(viewModelInstance));
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.js"></script>
...