Как связать класс CSS внутри пользовательского связывания
Я создал пользовательскую привязку для использования в качестве палитры цветов.
<ul data-bind="colorPicker: selcol"></ul>
Он создает 10 встроенных div, каждый из которых представляет другой цвет. Когда я нажимаю div, цвет выбирается. У меня проблема с назначением "выбранных"; класс css для выбранного div. Я пытаюсь использовать привязку CSS внутри пользовательской привязки, но это не работает. Он выбирает только начальный div, который остается выбранным даже после выбора другого div.
Пожалуйста, проверьте пример: http://jsfiddle.net/zbkkzdsp/Jbvvq/
Спасибо за любую помощь. Если у вас есть какие-либо подсказки или комментарии к моему коду, пожалуйста, дайте мне знать. Я довольно новичок в нокауте и буду использовать любую возможность, чтобы узнать больше.
1 ответ
Кажется, что вы делаете много модных вещей с вычисленными значениями в вашей пользовательской привязке, поэтому я бы порекомендовал создать модели представления для ваших цветов.
Сначала определите модель вида для каждого отдельного цвета:
var ColorModel = function(options) {
var self = this;
// Keep a reference to the parent picker for selection
self.picker = options.picker;
// The CSS value of the color
self.color = ko.observable(options.color || 'transparent');
// A flag denoting whether this color is selected
self.selected = ko.observable(options.selected || false);
// This will be called when the corresponding color link is clicked
// Note that we're not doing any event binding with jQuery as with your custom binder
self.select = function() {
self.picker.selectColor(self);
};
};
Затем модель представления для самого палитры цветов:
var ColorPickerModel = function() {
var self = this;
// The list of all colors
self.colors = ko.observableArray([]);
self.addColor = function(color) {
var newColor = new ColorModel({
picker: self,
color: color
});
self.colors.push(newColor);
return newColor;
};
// Called by individual colors
self.selectColor = function(colorModel) {
// Deselect the current color so we don't select two
var current = self.selected();
if (current) {
current.selected(false);
}
// Mark the color as selected - KO will do the rest
colorModel.selected(true);
// Remember this color as the selected one to deselect later
self.selected(colorModel);
};
// Create at least one default color
var transparent = self.addColor('transparent');
// Keep track of the selected color - set to transparent by default
self.selected = ko.observable(transparent);
transparent.select();
};
Затем свяжите ваш HTML-вид с вашей моделью представления:
<div id="color-picker">
<div data-bind="foreach: colors">
<a href="#" data-bind="
style: { 'background-color': $data.color },
css: { 'selected': selected },
click: select"></a>
</div>
<div>
Selected color: <span data-bind="text: selected().color"></span>
</div>
</div>
И связать все это вместе:
var pickerDiv = document.getElementById('color-picker'),
picker = new ColorPickerModel();
// Add some colors
picker.addColor('red');
picker.addColor('blue');
picker.addColor('green');
picker.addColor('orange');
picker.addColor('purple');
picker.addColor('black');
// Bind Knockout
ko.applyBindings(picker, pickerDiv);
// Add more colors - the view will update automatically
picker.addColor('pink');
Вот рабочий пример: http://jsbin.com/izarik/1/edit