2013-07-30 57 views
6

我使用的後續代碼來獲得JSON對象,並將其綁定到$範圍

工作代碼:

$http({ 
    url: '/Home/GetJson', 
    method: "GET", 
    params: { 
     clientID: cId 
    } 
}).success(function (data) { 
    $scope.members = data.members; 
}) 

它的工作..我會喜歡做的是將結果寫入var data然後將其添加到$ scope。

失敗CODE:當它充滿

var data = $http({ 
    url: '/Home/GetJson', 
    method: "GET", 
    params: { 
     clientID: cId 
    } 
}).success(function (data) { 
    return data.members; 
}) 

$scope.members = data; 

當我看着$ scope.members,它是失敗的代碼,因爲$ scope.members空是空的(JS是基於事件)。

我該如何等到json返回>然後var = data>然後$ scope.members = data?

工作代碼

我用JavaScript回調函數如下

叫我的主要功能

DoLogin($scope, $http, email, password, AssingMemberToScope); 


function DoLogin($scope, $http, email, password, callback) { 
$http({ 
    url: '/Home/GetJson', 
    method: "GET", 
    params: { 
     clientID: cId 
    } 
}).success(function (data) { 
    callback($scope, data); //<----- Call Back occurs 
}) 
} 

// - 回調函數的工作和代碼分離 -/

function AssingMemberToScope($scope, data) { 
    if (data.msg) { 
     $('.loading').hide(); 
     $scope.member = data.member; 
    } else { 
     $('.loading').hide(); 
     $('#msg').show(); 
    } 

} 
+0

您在第一個示例中通過在回調中指定它來正確執行此操作,爲什麼要更改它? – tymeJV

+0

我想將整個json調用放在一個單獨的函數中,並將數據返回到函數中,以便我可以做一些事情。 –

回答

7

我覺得更好的方法是將JSON調用放入一個接受callback函數作爲參數的函數中。簡單的例子:

function makeJSONCall(callback) { 
    $http({ 
     url: '/Home/GetJson', 
     method: "GET", 
     params: { clientID: cId } 
    }).success(function (data) { 
     callback(data); 
    }); 
} 

function someFunctionCallback(param) { 
    console.log(param) 
} 

現在,callback函數內部,你想用什麼樣的數據。你現在也可以在需要時調用JSON函數,一個簡單的makeJSONCall(someFunctionCallback)就可以。

+0

我喜歡這個答案。承諾非常酷,但增加了複雜性。這代表了一種更直接的方法,可能在大多數情況下都有效。 –

+0

@tymeJV - 更新與工作代碼的帖子..謝謝! –

+1

.success()已經在Angular 1.4中放棄了使用然後() –

2

實際上,你在你的最後一句話自己解釋的話,你可以使用的承諾和他們當時()回調

var data = $http({ 
url: '/Home/GetJson', 
method: "GET", 
params: { clientID: cId } 
}) 
.then(function (data) { 
    return data.members; 
}) 
}; 

... 
... 
data.then(function(response){ 
    //play with the data 
    $scope.data=response 
}) 
8

嘗試這種模式:

angular.module('App').factory('service', function ($http) { 
    var service = { 
     myFunction: function (query) { 
      var promise = $http({ 
       url: '/Home/GetJson', 
       method: "GET", 
       params: { 
        clientID: cId 
       } 
      }).success(function (data) { 
       return data.members; 
      }); 
      return promise; 
     }; 
    } 
}); 

然後使用該服務時,做

service.myFunction(query).then(function (data) { 
    $scope.members = data.members; 
}); 
+0

好的方法,+1 – tymeJV

+1

@zsong成功方法在這裏做什麼?它不會將data.members返回給消費者(因爲您必須再次編寫data.members) – Todilo