Я должен вызвать метод viewmodel после того, как идентификатор элемента управления создается динамически привязкой attr.

Ниже мой html-код

 <div data-bind="attr: {id: 'bookScreen_' + bookId }">
 </div>

После создания управляющего идентификатора я хочу вызвать метод, в котором я выполняю некоторую работу, используя селектор $ (id).

Как мне вызвать метод viewmodel после создания идентификатора для div?

0
Max Maddy 27 Июн 2016 в 10:34

1 ответ

Лучший ответ

Общее правило:

Когда бы вы ни захотели прикоснуться к DOM,

  1. Постарайтесь сделать как можно больше с помощью привязок по умолчанию для нокаута. Большую часть обработки событий можно выполнить с помощью привязки event или click. Значения могут быть связаны с вашей моделью просмотра с помощью привязок value или textInput. Стили можно применять с помощью css.
  2. Если привязки по умолчанию нет, создайте настраиваемую привязку.

Некоторые привязки по умолчанию имеют параметр 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()); 
1
user3297291 27 Июн 2016 в 12:24
Очень хорошее решение, я хочу передать значение из html, предположим, я хочу передать константу 50 вместе с элементом для просмотра модели, как мне это сделать?
 – 
Max Maddy
27 Июн 2016 в 12:18
Я отредактировал свой исходный ответ, включив в него ответ на ваш вопрос.
 – 
user3297291
27 Июн 2016 в 12:24
Спасибо, я понял это :)
 – 
Max Maddy
27 Июн 2016 в 12:26