我的观点中有以下脚本:
<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")); });`
但在这种情况下,我多次绑定到同一个元素时出现错误。
答案 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});
}
}
这是未经测试的代码