使用foreach数据值创建AJAX调用

时间:2015-06-09 03:56:29

标签: jquery ajax knockout.js

我基本上有一个表单数据列表'每个都包含一个属性。 每个属性都有自己独立的数据,如ID,QuestionText等。

下面我有我的HTML,我的数据绑定了pageitems然后我正在设置' attributeid'作为表的id,一切正常。

我现在想要做的就是它说'$ root.getAttributeTitle()',我需要进行ajax调用以检索属性数据的属性数据'这是上面提到的,但每当我创建一个函数时,

self.getAttributeTitle = function(id){
   var sTitle = '';
   $.post(url, sendData, function(response){
       sTitle = response.data.QuestionTitle;
   });
   return sTitle;
}

...它试图在ajax调用完成之前返回该值。

任何想法都会非常感激!

<!--ko foreach: pageitems-->
<table class="table" data-bind="attr: { id: $data.attributeid() }">
    <tbody>
        <tr>
            <th colspan="2" data-bind="text: $root.getAttributeTitle($data.attributeid())"></th>
        </tr>
        <tr>
            <td>

            </td>
        </tr>
    </tbody>
</table>

3 个答案:

答案 0 :(得分:0)

您应该延迟代码,直到Ajax调用完成,您不能指望您的代码立即从远程位置返回值。以下是如何更改getAttributeTitle函数的用法:

getAttributeTitle (id) {
   var _this = this;
   return $.post(url, sendData);
}

//then you can use it like this:
getAttributeTitle(id).done(function (response) {
  console.log(response.data.QuestionTitle);
})

答案 1 :(得分:0)

您正在使用$ .post,这是$ .ajax的简写,它没有设置异步的选项。 Bu默认$ .post将考虑async = true,这导致在不等待响应的情况下运行到下一行。 你必须把

$.ajaxSetup({ asynch: false }) 

在$ .post之前,然后在最后再次启用

$.ajaxSetup({ asynch: true }).

希望有所帮助。

答案 2 :(得分:0)

不要绑定到数据获取函数调用,绑定到observable的成员pageitems,并在填充pageitems时执行异步数据提取。 Knockout会在获得标题时填写标题。

您需要修改获取例程以填充observable,它可以很好地工作:

self.getAttributeTitle = function(id, observable){
   $.post(url, sendData, observable);
}