4

У меня есть параметры серии, которые пользователь может выбрать, и я могу отслеживать через наблюдаемый массив. Сам массив загружается из Модели, которую я приношу в нокаут с помощью расширения отображения нокаута (ko.mapping.fromJS). Все работает нормально.Отключение/удаление Выбор параметров, созданных с помощью привязки опций нокаута

Объясняя это получит, но многословным и может вызвать еще большую путаницу, чтобы увидеть диаграмму ниже:

Situation

В основном:

  • У меня есть веб-форму входа (его конфигуратор сортирует)
  • Список предметов довольно большой, я бы сказал, что 10 возможных вариантов можно добавить в конфигурацию
  • Когда пользователь добавляет элемент, я нажимаю по умолчанию «Item A» в массив, привязанный к параметрам, и он отображается просто отлично.
  • То, что я пытаюсь сделать, это удалить элемент А из его выбора после его добавления один раз. Если он удален, он должен быть в состоянии быть добавлен
  • Как все это происходит через KO observables - один для отслеживания доступных параметров, а другой для отслеживания опций «Выбранные». Как я уже сказал, все работает нормально, и я пытаюсь настроить его на основе запроса.

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

Я обнаружил «Post-processing the generated options», но представленный пример объявляет массив в строке, и я не уверен, как я могу привязать этот тип вызова к наблюдаемому массиву I auto map, используя расширение отображения.

В двух словах мне интересно, есть ли у кого-нибудь идея о том, как отключить предыдущий выбор (помните, что ВСЕ выборки находятся в одном наблюдаемом массиве, а ВЫБРАННЫЕ - в другом) - или это невозможно учитывая источник моих данных. Таким образом, в ярко-розовом выделенном аннотации на изображении - мне идеально понравилось бы только «Item B и Item C», но если ITEM A может быть отключен, это тоже сработает.

Я не знаю, была ли жизнеспособна jQuery манипуляция с DOM? Это должно произойти после привязки данных и может стать беспорядочным.

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

Некоторые код (упрощенно, чтобы защитить виновных)

public class ItemsModel 
{ 
    public List<ItemTypes> ItemTypes{ get; set; } 
    public List<SelectedItemTypes> SelectedItemTypes{ get; set; } 
} 

public class ItemTypes 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
} 

public class SelectedItemTypes 
{ 
    public int Id { get; set; } 
    public decimal Amount { get; set; } 
} 

** Javascript/HTML (опять надрезается для соответствующих частей) **

 self.worksheetitems = ko.mapping.fromJS(@Html.Raw(Model.ToJson())) 
     /* Adds an Item */ 
     self.addItem= function() { 
       self.worksheetitems 
       .SelectedItemTypes.push({ 'Id': ko.observable(), 
       'Amount': ko.observable(0)}); 

Html Таблица, которая содержит этот материал (обратите внимание на foreach через выбранные элементы и привязку к массиву всех элементов):

<!-- Items --> 
<tbody data-bind= 
     "visible: worksheetitems.SelectedItemTypes().length > 0, 
     foreach: worksheetitems.SelectedItemTypes"> 
      <tr> 
       <td> 
       <select data-bind= 
         "options: $root.worksheetitems.ItemTypes(), 
         optionsText: 'Description', 
         optionsValue: 'Id', value: Id"></select> 
       </td>   
      <tr/> 
    <!-- Snipped --> 

    <button data-bind="click: $root.addItem">Add</button> 
    <!-- Add Another Item --> 
+0

Ну объяснил вопрос, но это помогло бы, если бы вы добавить код на вопрос поможет нам сделать минимальный воспроизводимым сценарий. То, что вы хотите, безусловно, возможно (без jQuery), но детали будут зависеть от вашего контекста. – Jeroen

+0

уверен, что я добавлю код – kd7

+0

Я думаю, что вы можете использовать опцию для указания обратных вызовов [при сопоставлении создает элементы] (http://knockoutjs.com/documentation/plugins-mapping.html#customizing_object_construction_using_create), чтобы настроить генерируемых наблюдаемым. Вы можете попытаться объединить это с обработкой [setOptionsDisable] (http://knockoutjs.com/documentation/options-binding.html#note_2_postprocessing_the_generated_options), о которой вы упомянули. Это поможет? – Jeroen

ответ

1

Не уверен, если я правильно понимаю, но это звучит, как вы ищете Computed Observables:

self.AvailableItemTypes = ko.computed(function() { 
    var selectedTypeIds = this.SelectedItemTypes().map(function(el) { 
     return el.Id; 
    }); 
    return this.ItemTypes().filter(function(el) { 
     return selectedTypeIds.indexOf(el.Id) === -1; 
    }); 
}); 
+0

Ну, я думал, это сработало, но некоторые тесты я получаю странное поведение, я вижу, что вы получаете массив selectedTypeIds, а затем вы фильтруете ItemTypes - Я не уверен, правильно ли этот фильтр, не должен ли он быть === 1 вместо -1, потому что вы хотите, чтобы только ItemTypes не были выбраны. – kd7

+0

Кроме того, будет ли indexOf возвращать массив? – kd7

+0

'indexOf' возвращает индекс данного элемента, если ни один элемент не был найден.' -1' возвращается. Так что фильтр должен возвращать новый массив только с элементами whos id не в 'selectedTypeIds' – sroes

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

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