2013-03-12 5 views
3

Мне просто интересно, как удалить свойство из нокаута viewModel. В частности, вычисленный. У меня есть простой viewModelУдалить объект из нокаута viewmodel

function viewModel(){ 
    var self = this; 
    self.name = ko.observable("John"); 
    self.lastname = ko.observable("Doe"); 
    self.age = ko.observable("22"); 
    self.fullName = ko.computed(function(){ 
     return self.name() + self.lastname(); 
    }); 
    self.fullNameAndAge = ko.computed(function(){ 
     return self.name() + self.lastname() + ': ' + self.age(); 
    }); 
}; 

Данные будут отправлены на сервер, но я хочу, чтобы исключить расчетные данные из viewModel.

Я думал, что что-то вроде этого получит все вычисленные данные и удалит их, но не нашел ничего подобного.

 for (observableKey in viewModel) { 
     if (ko.isComputed(viewModel[observableKey]) 
       { 
      delete viewModel[observableKey]; 
     } 
    } 

ответ

3

Нокаут может возвращать обычный объект, из которого вы можете удалить все, что захотите.

var plainJs = ko.toJS(viewModel); 
delete plainJs.fullName; 

Документировано here.

+2

Я нашел этот подход, но я хочу удалить все вычисленные, содержащиеся в viewmodel, не выписывая их один за другим. – Overmachine

+1

@Overmachine вы можете сделать это, проверить скрипту в моем обновленном ответе – gaurav

2

Вы можете перебрать ключи, как это:

for (var key in obj) { 
    if(ko.isComputed(obj[key])) 
    { 
     delete obj[key]; 
    } 
} 

EDIT

Here is a working fiddle .В скрипку нажмите на кнопку и проверьте консоль, там вы можете увидеть 2 объекта, первый один перед удалением вычисленных обсервативов, а второй - после удаления вычисленных наблюдаемых.

0

Мой предпочтительный подход для такого рода проблем заключается в создании конкретного объекта транспорта для любого вашего вызова JSON.

var userSaveRequest = function(data) { 
    var self = this; 
    self.name = data.name; 
    self.lastname = data.lastname; 
    // etc, etc 
} 

Затем, из моего кода вызова, что-то вроде этого, чтобы получить JSON.

// inside viewModel 
self.saveUser = function(){ 
    var queryData = ko.mapping.toJSON(
    new userSaveRequest(ko.mapping.toJS(self)) 
); 

    // use querydata in AJAX 
} 

Кроме того, стоит вспомнить, насколько проклятый гибкий Javascript. Если нужно, вы можете создать объект своей собственной конструкции на лету.

var queryData = ko.mapping.toJSON(
    { 
    name: self.name(), 
    lastname: self.lastname() 
    } 
); 

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

  • Нет связанных вопросов^_^