[Пожалуйста, смотрите обновления в нижней части]knockout.js зависимой переменной выбирает
Я пытаюсь сделать нокаут зависело выбирает, он предназначен, чтобы сделать выбор «продукт» по этим признакам, например, продукт может иметь «размер» и «материал», если я выбрал «размер», скрипт нокаута сделает запрос на бэкэнд и получит доступный «материал» для выбранного размера, другими словами, если выбран атрибут, другие атрибуты отфильтровываются, чтобы показывать только доступные значения («все размеры»: 1,2,3,4,5, «алюминий»: 1,4).
Список атрибутов полностью динамичен, существует около 80 атрибутов, которые могут быть связаны с продуктами произвольным образом.
Есть ли «лучшие практики» для этой ситуации?
Я пытаюсь решить с кодом, как это, без успеха еще:
var ViewModel = function(data) {
var self = this;
self.data = data;
self.attributes = ko.observableArray();
self.data.forEach(function(item, i, a) {
// I passed .self to catch it later
// in products as view_model.attributes().
self.attributes.push(new VariableProduct(item, self));
})
};
var VariableProduct = function(item, view_model) {
var self = this;
self.attribute_name = ko.observable(item.name);
self.attribute_value = ko.observable('--');
// list of attribute values
self.attribute_values = ko.computed(function() {
var result = {};
view_model.attributes().forEach(function(attribute, i, a) {
// here I try to filter each attributes lists by values
// it doesn't work well
if (attribute.attribute_name() != self.attribute_name() && self.attribute_value() != '--') {
result = attribute.attribute_values().filter(
function(value) {
return value.indexOf(self.attribute_value()) >= 0;
});
}
});
return result;
});
};
UPDATE 1: со ссылкой Dnyanesh на ko.subscribe(), я уже achived эти результаты, ISN «т ок пока, но прогресс:
http://jsfiddle.net/xwild/65eq14p3/
UPDATE 2: в конце концов, это было Солв ed с knockout.reactor и knockout.mapping плагинами.
Related stackoverflow question с подробностями и ответом.
Интересный вопрос, нужно ли также работать наоборот? Например, если вы выберете материал, в раскрывающемся списке выберите размер доступных размеров. Или все атрибуты связаны с 1 выпадающим списком (размеры) .. Другими словами: «размеры» - единственная независимая переменная, а все остальные зависят или все атрибуты взаимозависимы? – Tyblitz
Да, для каждого продукта помещено около 10-15 фильтров, и каждый выбор должен реагировать при изменении другого выбора. – xwild
Не говоря о реальном коде, я думаю, было бы полезно подумать о дизайне. Я полагаю, что ваш вывод должен быть похож на http://us.acer.com/ac/en/US/content/models/laptops (идите вперёд и проверьте некоторые поля); и я не думаю, что разумно полностью опустить варианты, когда они не могут быть выбраны. Скорее, дайте понять посетителю, что его решение ограничивает его выбор, отключив флажки/ударяя их (см. Ссылку). Короче говоря, я думаю, что вам лучше использовать «радио» или «флажок» вместо 'select' – Tyblitz