2016-01-16 2 views
0

Это оказалось сложнее, чем я думал. У меня есть ViewModel, который я использую специально для фильтрации в своих сетках. Вот оно:Удалить пустые свойства нокаута viewModel

var GridFiltersViewModel = function() { 
    var self = this; 

    self.search = ko.observable(); 
    self.sortColumn = ko.observable(); 
    self.sortDirectionIsAscending = ko.observable(true); 
    self.page = ko.observable(1); 
    self.pageSize = ko.observable(10); 
    self.pageCount = ko.observable(); 
    self.itemCount = ko.observable(); 
}; 

Проблема я столкнулся с, когда я посылаю экземпляр этого ViewModel к моему методу действия я получаю ошибку:

The value 'null' is not valid for property

Это происходит потому, что моя сторона сервера Свойства ViewModel не принимают свойства null и undefined свойств ViewModel на стороне клиента, даже когда я устанавливаю их как NULL. Единственный способ, чтобы сервер ViewModel на стороне сервера принимал пустые свойства, - это не отправлять их вообще. Мое покушение на это:

var GridFiltersViewModel = function() { 
    // the properties from before 

    self.removeEmptyProperties = function() { 
     for (var property in self) { 
      if (self[property] === null || self[property] === undefined) { 
       delete self[property]; 
      } 
     } 
    }; 
}; 

Достаточно сказать, что это не сработает. В настоящее время я заканчиваю объект undefined, когда метод заканчивается. Я также попытался преобразовать нокаут ViewModel в объект JavaScript (используя ko.toJS()) перед запуском метода, но получаю тот же результат.

Что я здесь делаю неправильно и как мне это сделать правильно?

ответ

1

Я бы просто создать новый объект JSON и возвращать, что вместо того, чтобы попытаться что-то экзотическое, как удаление свойства ... что-то вроде этого:

var GridFiltersViewModel = function() { 
    var self = this; 
    self.prop1 = ko.observable(null); 
    self.prop2 = ko.observable('Test'); 
    self.prop3 = ko.observable(undefined); 
    self.definedProperties = ko.computed(function() { 
     var json = {}; 
     json.props = ""; 
     for (var property in self) { 
      if (self[property]() !== null && self[property]() !== undefined) { 
       json[property] = self[property](); 
       if (json.props !== "") { 
        json.props += ", ";     
       } 
       json.props += property; 
      } 
     } 
     return json; 
    });  
}; 

Полный пример здесь: https://jsfiddle.net/brettwgreen/ehy7cmud/2/

+0

Отметим также, хотя , что вы не разблокировали свои наблюдаемые проверки с помощью круглых скобок ... так что вы возвращаете необработанные функциональные объекты в исходный код при проверке self [property]. Должно быть self [property](). Может быть источником вашей боли. –

+0

Скобки не являются источником моей боли, но это не имеет значения, ваше решение отлично работает! – Alternatex

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