javascript - 从 knockout View 模型访问 html 元素

标签 javascript html mvvm knockout.js typescript

我创建了一个包含引导模式对话框的 knockout 组件,我正在注册并加载该组件(作为 AMD 模块),如下所示:

// Register dialogs as components
ko.components.register('create-user-dialog', {
    viewModel: { require: 'Features/Users/Index/CreateController' },
    template: { require: 'text!Features/Users/Index/CreateDialog.html' }
});

模板 HTML 包含如下标签:

<div class="modal fade" id="create-user-modal" tabindex="-1" role="dialog">
...
</div>

knockout View 模型扩展了一个基类,看起来像这样( typescript ):

export = CreateController

class CreateController extends Controllers.BootstrapModalController {

    constructor() {
        super($('#create-user-modal'));
    }
}

class BootstrapModalController {
    public dialog: JQuery;

    constructor(dialog: JQuery) {
        // Save a reference to the modal element so we can 
        // show/hide the dialog from the controller
        this.dialog = dialog;
    }

    // Show the modal window
    showModal = () => {
        this.dialog.modal({
            show: true,
            backdrop: 'static'
        });
    }

    // Close the modal window
    closeModal = () => {
        this.dialog.modal('hide');
    }
}

最后,我在页面中使用该组件,如下所示:

<div data-bind="component: 'create-user-dialog'"></div>

这可行,但有点困惑,因为 CreateController在构造函数中做了一些我认为有点奇怪的事情 - 即使用 jquery 选择器将其与模板中的 html 紧密耦合。

在某种程度上,这是不可避免的,但我认为它可以更好一点。如果可以的话,我想要 BootstrapModalController基类能够自动确定与 Bootstrap 模式对应的 DOM 元素...这样 showModalcloseModal只要模板实际上包含引导模式对话框,并且后代不必在构造函数中显式传递 ids 或 jquery 对象,就可以工作。

我认为它可能可以使用类似 jQuery find 的东西寻找 CSS 类元素的方法 modal在组件的 HTML 模板中。然而,为了做到这一点,我需要能够获取 Knockout 绑定(bind)组件 View 模型的 rootNode(即 <div data-bind="component: 'create-user-dialog'"></div> 元素)。

有没有办法从该组件的 javascript View 模型中计算出该组件的 html rootNode?

最佳答案

您可以使用自定义绑定(bind),如 http://www.knockmeout.net/2011/07/another-look-at-custom-bindings-for.html 中所述。文章,以便使用 Knockout 包装 HTML/JS 元素,例如jquery按钮绑定(bind):

ko.bindingHandlers.jqButton = {
    init: function(element, valueAccessor) {
        var options = valueAccessor() || {};
        $(element).button(options);
    }
};

用法:

data-bind="jqButton: { ...some options... }"

在自定义绑定(bind)中,您可以访问应用绑定(bind)的元素。

关于javascript - 从 knockout View 模型访问 html 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29624849/

相关文章:

javascript - 使用 jQuery 选择不在类名中的第一个 div

c# - MvvmCross - 如何添加自定义模式转换

c# - MVVM 中具有动态内容的 WPF 状态栏

php - 刷新时 JavaScript 不加载

javascript - 如何飞到react-leaflet中的某个位置

javascript - 如果我放置日期选择器函数,数据表根本不起作用

java - 如何在 Tomcat 中为多个错误代码使用相同的错误页面?

html - CSS 对 Angular 边框输入字段

html - 如何使用透视进行这样的悬停?

c# - 如何在 WPF 中使用 MVVM 从另一个 View 打开一个 View