Я должен вызвать метод viewmodel после того, как идентификатор элемента управления создается динамически привязкой attr.
Ниже мой html-код
<div data-bind="attr: {id: 'bookScreen_' + bookId }">
</div>
После создания управляющего идентификатора я хочу вызвать метод, в котором я выполняю некоторую работу, используя селектор $ (id).
Как мне вызвать метод viewmodel после создания идентификатора для div?
1 ответ
Общее правило:
Когда бы вы ни захотели прикоснуться к DOM,
- Постарайтесь сделать как можно больше с помощью привязок по умолчанию для нокаута. Большую часть обработки событий можно выполнить с помощью привязки
event
илиclick
. Значения могут быть связаны с вашей моделью просмотра с помощью привязокvalue
илиtextInput
. Стили можно применять с помощьюcss
. - Если привязки по умолчанию нет, создайте настраиваемую привязку.
Некоторые привязки по умолчанию имеют параметр afterRender
, в котором вы можете указать метод обратного вызова, который будет передан элементу, к которому были применены привязки (например, привязка foreach
). Однако эти методы предназначены для использования для анимации / переходов; изменять DOM не рекомендуется.
Пример пользовательской привязки с методом init
:
ko.bindingHandlers.logIDAfterBind = {
init: function(element) {
console.log(element.id);
}
};
С HTML:
<div data-bind="attr: {id: 'bookScreen_' + bookId }, logIDAfterBind"></div>
Редактировать после вопроса в комментариях:
Как передать константу моему пользовательскому обработчику привязки?
Сигнатура метода init
на самом деле намного более универсальна, чем я показал в моем упрощенном примере. Вы можете передать значение (на самом деле любой действительный JavaScript) в привязку, используя bindingKey: bindingValue
. Например:
<div data-bind="attr: {id: 'bookScreen_' + bookId }, logIDAfterBind: 'a_constant_string'"></div>
Это значение заключено в функцию и доступно через второй параметр init
:
init: function(element, valueAccessor) {
var myConstant = valueAccessor(); // Will be "a_constant_string"
}
В привязках, которые поддерживают как наблюдаемые, так и другие значения, вы часто увидите, что используется ko.unwrap
.
// Gets the value from the binding; if it's an observable,
// it "gets" the inner value
var bindingValue = ko.unwrap(valueAccessor());
Похожие вопросы
Новые вопросы
knockout.js
Knockout.js - это библиотека JavaScript с открытым исходным кодом для динамического HTML. Использует шаблон Model-View-Viewmodel (MVVM).