Не зная, чем именно вы занимаетесь, кажется, что вы идете неправильным путем. Ваше представление должно управляться вашей моделью представления. Таким образом, вы не должны напрямую добавлять элементы DOM, к которым затем нужно применить нокаутирующие привязки.
Вместо этого вы должны обновить свою модель представления, чтобы отразить изменение в представлении, что затем приведет к появлению вашего нового элемента.
Так, например, для вашего $('body').append('<a href="#" data-bind="click: something">Click me!</a>');
вместо добавления элемента DOM, когда кнопка должна быть видимой, управляйте видимостью кнопки с помощью модели представления.
Итак, ваша модель представления включает
var viewModel = { clickMeAvailable: ko.observable(false) }
И ваш HTML включает
<a href="#" data-bind="click: something, visible: clickMeAvailable">Click me!</a>
Когда состояние приложения изменится, и кнопка «Нажми меня» станет доступной, вы просто viewModel.clickMeAvailable(true)
.
Смысл этого, и большая часть нокаута, состоит в том, чтобы отделить бизнес-логику от представления. Таким образом, код, который делает доступным click me, не заботится о том, что click me включает в себя кнопку. Все, что он делает, это обновляет viewModel.clickMeAvailable
, когда доступен click me.
Например, скажем, нажмите на меня — это кнопка сохранения, которая должна быть доступна, когда форма заполнена корректно. Вы бы привязали видимость кнопки сохранения к наблюдаемой модели представления formValid
.
Но затем вы решаете что-то изменить, поэтому после того, как форма станет действительной, появится юридическое соглашение, с которым необходимо согласиться перед сохранением. Логика вашей формы не меняется - она по-прежнему устанавливает formValid
, когда форма действительна. Вы бы просто изменили то, что происходит при изменении formValid
.
Как указывает Лассомбра в комментариях к этому ответу, бывают случаи, когда лучшим подходом может быть прямое манипулирование DOM — например, сложная динамическая страница, на которой вы хотите увлажнять только части представления по мере необходимости. Но вы отказываетесь от части разделения интересов, которое обеспечивает Knockout, делая это. Будьте внимательны, если вы планируете пойти на этот компромисс.
22.12.2011