我有这个简单的div:
<div id="mainContent">
</div>
并且它是空的。现在我尝试将此HTML
附加到上面的div:
<div id="mainContent">
<label>Project Name</label>
<input type="text" id="projectName" data-bind="value: projectName"/>
<label>Tracker Name</label>
<input type="text" id="trackerName" data-bind="value: trackerName"/>
</div>
<button type="submit" data-bind="click: submitNewProject">Submit</button>
使用:
$.ajax({
type : 'POST',
url : 'newTracker.php',
dataType : 'html',
success : function(data){
$("#mainContent").html(data);
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
alert('Something is wrong!');
}
});
data
HTML
我试图通过以下方式分配$("#mainContent").html(data);
首先看一切看起来很漂亮,但是有一个问题 - 绑定不起作用。
我的意思是在新分配的HTML
中我有一个按钮应该调用viewmodel函数,但它没有...
但如果我将代码直接放在div中,那么绑定就像魅力一样。
当我在div中分配新的HTML
代码时,为什么我的出价无效?我知道我在这里遗漏了一些非常小而基本的东西,但我无法发现它。
编辑:
按钮事件:
submitNewProject = function(){
console.log("submit new project");
};
答案 0 :(得分:5)
Knockout无法跟踪新创建的元素,如果使用Ajax方法更改了DOM,则必须将视图模型显式绑定到新创建的元素。
类似的东西:
$.ajax({
type: 'POST',
url: 'newTracker.php',
dataType: 'html',
success: function (data) {
var $mainContent = $("#mainContent");
$mainContent.html(data);
var existingViewModel = ko.dataFor(document.body);
ko.applyBindings(existingViewModel, $mainContent.get(0));
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert('Something is wrong!');
}
});
答案 1 :(得分:2)
有时您需要在父页面上创建辅助函数以应用绑定,然后在附加文本中调用该函数。在加载时在原始页面上定义的所有功能都将可用。我以前使用过这种方法,但你必须事先知道需要构建哪些函数。或者您可以将绑定包含在后期ajax过程中。
它使ajax加载具有良好的功能
function bindStuff() {
$(".class1").click(function() {
// do something with the bind
});
}
function ajaxLoad() {
// Perform ajax load
// on complete call your bindings
complete: function() {
bindStuff();
}
}
用你的例子:
$.ajax({
type : 'POST',
url : 'newTracker.php',
dataType : 'html',
success : function(data){
$("#mainContent").html(data);
},
complete: function(){
bindStuff();
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
alert('Something is wrong!');
}
});
答案 2 :(得分:2)
正如大多数人所指出的那样。当您使用append动态添加HTML时,DOM不会重新评估绑定。所以,你需要:
success
事件处理程序document
html onChange
处理程序中应用/重新应用您的绑定display:none
样式的元素使用类,然后将样式更改为display:block
, display:inline-block
等等。.append()
任何不依赖于绑定的其他内容