2016-10-05 4 views
1

На мой взгляд, модель я объявил наблюдаемую свойство «MappedItem»:варианты картографирования Нокаут не исключая дополнительные свойства из исходного объекта

var MyViewModel = function() { 
    var $scope = this; 

    ... 

    $scope.MappedItem = ko.observable(); 

    ... 

Мне нужно отобразить объект под названием «элемент», который имеет несколько свойства. Мне нужно только три из них в моем наблюдаемом виде. Итак, вот что я хочу:

var mapping = {'include': ["recid", "Program", "Station"]}; 
$scope.MappedItem = ko.mapping.fromJS(item, mapping); 

Это работает, но мои правила отображения игнорируются, и я в конечном итоге с «MappedItem», имеющей много бесполезных наблюдаемых свойств.

Чтобы получить то, что я хочу, я должен явно объявить каждое свойство я не хочу, проложенный в «игнор» атрибут вариантов отображения объекта:

var mapping = { 
    'ignore': ["AdLength", "Affiliate", ... (MANY OTHER PROPERTIES MORE) ], 
    'include': ["recid", "Program", "Station"] 
}; 
$scope.MappedItem = ko.mapping.fromJS(item, mapping); 

Другой подход, который я пробовал:

ko.mapping.fromJS(item, mapping, $scope.MappedItem); 

Но это не относится ни к одному из свойств 'item' к 'MappedItem' вообще.

Не должен ли я отображать необходимые свойства только с помощью «include», не указывая явно их в опции «игнорировать»?

ответ

1

Массив «include» полезен только при сопоставлении элемента более одного раза. Например, предположим, что вы сопоставили элемент. Позже вы снова нанесете один и тот же элемент, за исключением этого времени, три дополнительных свойства были добавлены к элементу. По умолчанию Knockout игнорирует эти дополнительные три свойства, потому что их не было в первый раз. Настраивая массив «include», вы можете заставить Knockout сопоставить эти дополнительные три свойства.

К сожалению, массив 'include' не является белым, как вы ожидали.

В работе вокруг, вы можете настроить объект отображения с помощью функции 'Создать', и включают в себя только те свойства, которые вы хотите:

Javascript

var item = { 
    'recid': '0', 
    'Program': 'TestProgram', 
    'Station': 'TestStation', 
    'ignoredProperty': 'test' 
}; 

var mapping = { 
    create: function(options) { 
    var orig = options.data; 
    var filtered = { 
     'recid': ko.observable(orig.recid), 
     'Program': ko.observable(orig.Program), 
     'Station': ko.observable(orig.Station) 
    }; 
    return filtered; 
    } 
}; 

var myViewModel = function() { 
    var $scope = this; 
    $scope.MappedItem = ko.mapping.fromJS(item, mapping); 
}; 

var vm = new myViewModel(); 
ko.applyBindings(vm); 

скрипку:https://jsfiddle.net/dw1284/g8ca78kc/

0

включает

При отображении вашего существующийview model обратно к JS object, по умолчанию отображения плагин включает в себя только те свойства, которые являются частью вашего existing view model, если вы include те, которые таковыми не являются.

игнорировать

Если вы хотите ignore некоторые свойства вашего JS object когда вы хотите, отображение плагин создает модель представления для вас, вы можете указать их как массив имя, которое должно быть проигнорировано.

Вот почему, когда вы создаете view model отображение плагин просто берет то, что вы указали в ignore массиве, и это фактически отрицает ваш include, который имеет смысл.

Чтобы сделать то, что вы хотите, так как вы хотите иметь только три свойства из многих, я предлагаю создать модель подвидного вручную с этими тремя наблюдаемыми переменными, тогда у вас не будет много ненужных переменных на вашей модели.

var MyViewModel = function() { 
    var $scope = this; 
    ... 
    $scope.MappedItem = ko.observableArray(); 
    $scope.MappedItem($.map(items, function (item) { 
     return new ItemViewModel(item); 
    })); 
} 

var ItemViewModel = function (data) { 
    var $scope = this; 
    $scope.recid = ko.observableArray(data.recid); 
    $scope.Program = ko.observableArray(data.Program); 
    $scope.Station = ko.observableArray(data.Station); 
}