Я искал высоко и низко для ответа на этот вопрос, но не мог для меня жизнь выяснить, что я делаю иначе, чем официальный пример, кроме того, что я думаю, что мой случай использования является немного более сложным:Несколько компонентов нокаута в одном и том же виде
http://knockoutjs.com/documentation/component-binding.html
в принципе, я пытаюсь создать повторно используемые элементы пользовательского интерфейса. Поведение будет по существу передано им через объект «params». Я хочу, чтобы несколько элементов могли существовать на одной странице, однако, именно там я столкнулся с трудностями.
Я использую browserify связать свой код и следующее (некоторые записи усечен для краткости):
index.html
<div data-bind='component: { name: "toggle" , params: {
enabledText: "Parental controls are enabled",
disabledText: "Parental controls are disabled"
}}'></div>
<div data-bind='component: { name: "toggle" , params: {
enabledText: "Same component, different behavior: enabled",
disabledText: "Same component, different behavior: disabled"
}}'></div>
main.js
var ko = window.ko = require('knockout'),
toggle = require('./components/toggle/toggle');
ko.components.register('toggle', toggle);
function Container() {
}
var con = new Container();
ko.applyBindings(con);
компонентов /toggle/toggle.js
var ko = require('knockout'),
template = require('./toggle.html');
function vm(params) {
var self = this;
self.enabled = ko.observable(false);
self.label = ko.computed(function() {
return self.enabled() ? params.enabledText : params.disabledText;
});
}
module.exports = { viewModel: vm, template: template };
И, наконец, в компонентах/тумблер/toggle.html:
<input type='checkbox' data-bind='checked: enabled' id='switch-checkbox' class='switch-input' />
<label for='switch-checkbox' class='switch-input-label'>
<span data-bind='text: label'></span>
</label>
Проблема у меня в том, что компоненты, как появляются на странице надлежащим образом, но при нажатии на второй активирует первый (и делает ничего для seconD). Я новичок в Knockout и явно чего-то не хватает, но я не могу понять, как исправить мою проблему. Любая помощь будет очень оценена!
Странно то, что ярлыки являются соответственно уникальными, что указывает на то, что компоненты (модели представления), созданные для каждого объекта HTML, фактически уникальны ... однако, похоже, что «проверенная» привязка нокаута является обязательной к первому.
EDIT: Я знаю, что принято включать пример, так что вот один из косеферов. Я извиняюсь за помощью browserified коды, но, надеюсь, он по-прежнему читает:
http://codepen.io/sunny-mittal/pen/OVBNwp
Вы спасатель! Я очень надеюсь, что этот ответ поможет кому-то другому, потому что я много часов ломал голову над этим. –
Рад, что я мог бы помочь приятелю :) –
Семантически говоря, HTML-идентификатор всегда должен быть уникальным в соответствии со спецификациями HTML. Есть ли какая-либо техническая причина, по которой вы не можете их дублировать? Не совсем, но это лучшая практика, которая помогает предотвратить вышеупомянутую ситуацию. Если вы видите идентификатор в документе, следует предположить, что он не существует в другом месте. – mattLummus