2014-02-14 138 views
0

我有一个淘汰赛绑定到我的功能:AJAX请求返回值后函数已经返回

<tr id="toolbarRow" data-bind="foreach: get_tabs()"> 

get_tabs电话load它使用一个Ajax请求来填充departments变量:

get_tabs = function() { 
    load(); 
    return departments; 
}, 

这导致我出现问题,因为get_tabsdepartmentsload填充之前返回。

这里的load

load = function() { 
    $.ajax(
      { 
       url: _spPageContextInfo.webAbsoluteUrl + "/_api/search/query?querytext='Department:*" 
        + "*'&selectproperties='Department'&sourceid='B09A7990-05EA-4AF9-81EF-EDFAB16C4E31'&sortlist='Department:ascending'", 
       method: "GET", 
       headers: { 
        "accept": "application/xml", 
       }, 
       success: onSuccess, 
       error: onError 
      } 
     ); 
}, 

onSuccess = function (data) { 
    ...populating departments variable... 
}, 

onError = function (err) { 
    alert("something blew up"); 
}, 

我怎样才能保持get_tabs无法返回,直到我的Ajax请求结束onSuccess事件?

+3

阿贾克斯在本质,异步。您需要添加回调处理程序以正确获取http响应返回的数据。你的load()方法是什么样的? – jgitter

+0

'部门'应该返回Ajax的成功电话 –

+0

@SumanBogati您能详细说明吗?我不确定在我的代码中看起来如何。 – tnw

回答

2

正如评论指出,you can't expect to be able to return data from an AJAX request。通常,您会提供一个回调函数,该函数在检索结果后工作。

使用KnockoutJS时,正确的方法是使用observable array。在viewmodel中声明一个属性为可观察数组,将数据绑定到一些HTML,然后在需要时填充数据。这里有一个简单的例子:

function MyViewModel() { 
    this.departments = ko.observableArray([]); 
    this.load = function() { 
     $.ajax({ 
      /* your AJAX options */ 
     }) 
     .success(this.departmentsLoaded.bind(this)) 
    }; 

    this.departmentsLoaded = function (data) { 
     this.departments(data); 
    }; 
} 

您的视图/标记会是这个样子:

<div data-bind="foreach: departments"> 
    <span data-bind="text: $data"></span> 
</div> 
<button data-bind="click: load">Load</button> 

例子:http://jsfiddle.net/CCNtR/113/

+0

非常感谢,这个作品! – tnw

+0

@tnw:没问题,乐于帮忙! –

-2

您需要返回departmentsonSuccess()功能

onSuccess = function (data) { 
    return departments; 
}, 
+0

我该如何改变我的'get_tabs'和'load'函数来适应这个? – tnw

+0

这是...糟透了。成功处理程序不会返回任何东西。您应该使用处理程序重新绘制UI的一部分,或者触发事件。 – jgitter

+0

这是不正确的,根本无助于OP。 –

1

你变得温暖。 $ .ajax立即返回。您需要做的是在$ .ajax调用中使用您的成功处理程序对由服务器返回的数据作出反应。

这里是我会做:

get_tabs = function(callback) { 
    load(callback); 
} 
load = function(callback) { 
    $.ajax({ 
     ..., 
     success: function(data) { 
      // populate departments data 
      callback.apply(this, arguments); 
     } 
    }); 
} 
+0

请澄清你的第二句话,就像我说我不知道​​我的代码中看起来如何。 – tnw

+0

已添加代码示例。你的回调会处理渲染任何额外的UI元素。我建议使用客户端模板。 – jgitter

+0

仍然令人困惑。我通过KO绑定“回调”传递了什么?你也可以调用'load(callback)',但'load'不带任何参数。 – tnw

1

为什么不把部门可观察到的阵列和直接绑定到?不需要回调。你会做这样的事情:

<tr id="toolbarRow" data-bind="foreach: departments"> 

function myViewModel() 
{ 
    var self = this; 

    self.departments = ko.observableArray(); 

    //call the following in your document ready 
    myViewModel.prototype.load = function() 
    { 
     $.ajax(
     { //make your ajax call 


      success: function (result,status,xhr) 
      { 
       ...populating departments variable... 
      } 
     }); 
    } 
} 

$(document).ready(function() 
{ 
    //Toolbar will be empty because departments is empty at this point. 
    ko.applyBindings(myViewModel); 

    //Your onSuccess handler will populate the departments observable array 
    //when it changes, your toolbar will populate. No need for callbacks. 
    myViewModel.load(); 
} 

这真是knockoutjs的妙处在于,你不必担心处理这样的东西......很多;-)

+0

谢谢你的回应,查克。 – tnw

+0

不客气!感谢您的投票:-)。有没有设计原因,你为什么绑定到一个函数,而不是直接绑定到可观察数组?顺便说一句,这正是我已经在我的代码与Ajax调用。 –