Можно ли получить доступ к $ (this) и выполнить такие действия, как hide () или toggle () этого div в Knockout?
Да, но вы не должны этого делать.
Любой код jQuery (кроме служебных функций $.ajax()
) и любой другой код, который взаимодействует с DOM (модификация, обход, обработка событий, изменения стиля), должен полностью находиться вне вашей модели представления и вашей вид.
- Ваша viewmodel управляет состоянием вашего приложения, а не выглядит .
- Способ управления внешним видом приложения заключается в привязке свойств viewmodel для просмотра свойств.
- Представление должно полностью зависеть от модели представления, но модель представления должна иметь нулевые зависимости от представления.
- Добавление кода, вызывающего jQuery
.hide()
в viewmodel, вводит зависимость от представления внутри viewmodel. Предположим, вы изменили свое мнение, и .hide()
больше не является правильным решением. Теперь вам также нужно изменить модель представления - без добавления каких-либо реальных функций.
- Добавление кода, вызывающего jQuery
.hide()
в представлении, оставляет состояние внутри модели представления в темноте об изменении способа отображения вещей. Вы теряете контроль над тем, как выглядит модель представления, и постепенно вынуждены добавлять еще больше подобных хаков.
- Используйте существующие привязки (есть привязки всех основных взаимодействий, таких как отображение или скрытие элементов, добавление обработчиков событий, взаимодействие с элементами формы) или запись новых привязок для особого поведения.
Итак, в вашем случае вам нужно
- свойство viewmodel, которое отслеживает, должен ли элемент быть видимым
- функция для установки этого свойства
-
visible
переплет
В случае диалога, давайте назовем это свойство isVisible
и по умолчанию оно будет true
.
ViewModel:
function Alert() {
var self = this;
self.isVisible = ko.observable(true);
self.message = ko.observable("some text here");
self.dismiss = function () { self.isVisible(false); };
}
Вид, завернутый для удобочитаемости:
<div
data-bind="
text: message,
click: dismiss,
visible: isVisible,
text: message
"
class="alert alert-secondary alert-dismissible fade show"
role="alert"
></div>