gpt4 book ai didi

javascript - knockout 组件(不)绑定(bind)新内容

转载 作者:可可西里 更新时间:2023-11-01 01:31:12 25 4
gpt4 key购买 nike

已编辑的问题和示例

我试图让 Knockout 组件在初始 ko.applyBindings(); 之后绑定(bind)所以我可以动态添加自定义元素。

在我原来的帖子中,我提到了通过 ajax 加载内容,但是当使用 jQuery append 之类的东西将自定义元素添加到 DOM 时,我的问题就出现了。 .

这是一个例子:

$(function() {

// Register a simple widget:
ko.components.register('like-widget', {
template: '<div class="alert alert-info">This is the widget</div>'
});

// Apply bindings
ko.applyBindings();


// Wire up 'add' button:
$('#btnAdd').on('click', function() {

$('#addZone').append("<like-widget></like-widget>");


});

});
<link data-require="bootstrap-css@*" data-semver="3.2.0" rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<body>

Here's a widget, declared inline:
<like-widget></like-widget>

<button id='btnAdd'>Add a new widget to the grey box:</button>
<br/><br/>

<div id='addZone' class="well">
Widgets will be appended here
</div>

<p>When you run this code, the widget custom element is indeed added to the box (see source) but the widget's template is not bound, so nothing appears. How do I get it to bind/appear?</p>


</body>

原帖

我已经成功创建了我的新组件,<mynew-widget></mynew-widget>

我已经看到了用它们在我的页面上点缀的乐趣,并且一切都很好地工作......直到我加载包含 <mynew-widget></mynew-widget> 的新内容(例如,一个 AJAX 加载的模式弹出窗口) .没有任何反应。

这是 Knockout 的限制还是我连接不正确?

请告诉我是后者 - 因为我喜欢不必担心何时/何地调用 ApplyBindings 以及 DOM 的哪些部分。

仔细想想,我知道 knockout 需要注意自定义元素已添加到 DOM - 但我希望它可能只适用于 jQuery ' $().on(...) ' 一种方式。

最佳答案

组件绑定(bind)不会神奇地发生:它发生在您调用 ko.applyBindings(); 时。此时在绑定(bind)的HTML中搜索组件,并绑定(bind)它们。

稍后,当您向页面动态添加新组件时,它不会被绑定(bind),除非您显式绑定(bind)它。因此,在您的代码中,该组件被完全忽略。

如前所述,您需要做的是显式绑定(bind)它。但是您必须考虑到您不能绑定(bind)已经绑定(bind)的节点。然而,使用 jquery 创建节点、将其附加到 DOM 并绑定(bind)它非常容易。有一种语法可以指定 View 模型和要将其绑定(bind)到的节点:ko.applyBindings(viewModel, node);

Here you have a full working sample in jsfiddle .这是 fiddle 中的代码:

HTML:

这是一个内联声明的小部件:

  <button id='btnAdd'>Add a new widget to the grey box:</button>
<br/><br/>

<div id='addZone' class="well">
Widgets will be appended here
</div>

JavaScript:

ko.components.register('like-widget', {
template: '<div class="alert alert-info">This is the widget</div>'
});

ko.applyBindings()

$('#btnAdd').on('click', function() {
// Create your widget node
var $newWidget = $('<like-widget>');
// Append it to your "append area"
$('#addZone').append($newWidget);
// Apply bindings to the newly added node
ko.applyBindings({}, $newWidget[0]);
});

注意:调用应用绑定(bind)时,我传递了一个空对象:不要传递 null,否则您会收到错误消息。如果您的模板包含 View 模型,它将独立于传递的 View 模型使用。

注意:$newWidget 是一个 jquery 对象。 $newWidget[0] 是 jQuery 对象的第一个(也是唯一一个)DOM 元素,如 applyBindings 所要求的

关于javascript - knockout 组件(不)绑定(bind)新内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27137834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com