在jquery .html()附加后,绑定不起作用

时间:2014-06-10 13:14:12

标签: javascript jquery html knockout.js

我有这个简单的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");
                        };

3 个答案:

答案 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不会重新评估绑定。所以,你需要:

  1. .ajax success事件处理程序
  2. 中应用/重新应用您的绑定
  3. document html onChange处理程序中应用/重新应用您的绑定
  4. 首先将您的HTML静态放置,但对所有设置为display:none样式的元素使用,然后将样式更改为display:blockdisplay:inline-block等等。
  5. 使用上面的混合和一些静态HTML来至少建立按钮功能之间的绑定以及使绑定工作所需的任何其他内容,但随后动态.append()任何不依赖于绑定的其他内容