在ajax调用后应用Knockout绑定

时间:2015-06-26 15:30:50

标签: javascript ajax asp.net-mvc knockout.js

我的观点中有以下脚本:

<script>           
        MyObj.initModel(getUrl);            
        $(document).ready(function () {                
            ko.applyBindings(MyObj.viewModel, document.getElementById("someId")); 
        });
    </script> 

在initModel(getUrl)中我有一个ajax调用,成功时使用ko.mapping.fromJS(response);设置我的视图模型(MyObj.viewModel)

viewModel绑定到某个局部视图。

如何仅在 AFTER 我的ajax调用完成后才应用绑定?

我在视图中的脚本中尝试过类似的内容:

`$("#someId").ajaxComplete(function () { ko.applyBindings(MyObj.viewModel, document.getElementById("someId")); });`

但在这种情况下,我多次绑定到同一个元素时出现错误。

2 个答案:

答案 0 :(得分:2)

$(document).ready(function () { 
    var bindingCallback = function () {                
        ko.applyBindings(MyObj.viewModel, document.getElementById("someId")); 
    }; 

    MyObj.initModel(getUrl, bindingCallback);
});

然后在你的initModel中,只需在AJAX成功方法中调用bindingCallback方法,在其中添加bindingCallback();之类的东西。

答案 1 :(得分:0)

我的数据加载方法在我的viewmodel中,所以在ajax调用成功的时候我只是在self上应用绑定

ko.applyBindings(self, document.getElementById("someId"));

在我的viewmodel顶部声明了自己

 var self = this;

此外,由于我刚研究了如何使用jquery ajax中的promise模式,我以为我会把下一只猴子保存下来。 所以你只需要让initModel返回ajax调用的结果,这样你就可以使用when()和then():

$(document).ready(function () { 
   $.when(MyObj.initModel(getUrl)).then(function() {
        ko.applyBindings(MyObj.viewModel, document.getElementById("someId"));
    });
});

function MyObj() {
    this.initModel = function(getUrl){

         return $.ajax({url: getUrl});

    }
}

这是未经测试的代码