2013-07-30 34 views
6

Tôi đang sử dụng mã sau để có được đối tượng json và ràng buộc nó vào $ phạm vi

LÀM VIỆC Mã sản phẩm:

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

Nó hoạt động .. những gì tôi sẽ muốn làm là lấy kết quả vào một số var data rồi thêm nó vào phạm vi $.

Không Mã sản phẩm:

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

$scope.members = data; 

Khi tôi nhìn vào $ scope.members, nó là sản phẩm nào trong mã thất bại vì $ scope.members rỗng khi nó được lấp đầy (js là sự kiện có trụ sở).

Làm cách nào tôi có thể đợi cho đến khi json trả về> sau đó var = data> rồi $ scope.members = data?

LÀM VIỆC MÃ

tôi đã sử dụng chức năng gọi lại javascript như sau

Gọi chức năng chính của tôi

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 
}) 
} 

// - Gọi lại chức năng làm việc và mã số được tách ra -/

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

} 
+0

Bạn đang làm điều đó một cách chính xác trong mẫu đầu tiên bằng cách gán nó trong cuộc gọi lại, tại sao lại thay đổi nó? – tymeJV

+0

Tôi muốn đặt toàn bộ cuộc gọi json trong một chức năng riêng biệt và trả lại dữ liệu vào hàm để tôi có thể thực hiện một số nội dung cho nó. –

Trả lời

7

Tôi nghĩ một cách tiếp cận tốt hơn là đặt cuộc gọi JSON vào một hàm chấp nhận hàm callback làm tham số. Ví dụ nhanh:

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

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

Hiện tại, bên trong chức năng callback, thực hiện những gì bạn muốn với dữ liệu. Bạn cũng có thể gọi hàm JSON khi bạn cần nó ngay bây giờ, một đơn giản makeJSONCall(someFunctionCallback) sẽ thực hiện.

+0

Tôi thích câu trả lời này. Hứa hẹn rất mát mẻ nhưng thêm độ phức tạp. Điều này thể hiện một cách tiếp cận đơn giản hơn, có thể sẽ hoạt động trong hầu hết các tình huống. –

+0

@tymeJV - Cập nhật bài đăng với mã hoạt động .. cảm ơn! –

+1

.success() đã không được sử dụng trong Angular 1.4 insted của nó sử dụng sau đó() –

2

Bạn thực sự giải thích điều đó cho mình trong câu cuối cùng của bạn, bạn có thể sử dụng những lời hứa và sau đó họ() gọi lại

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

Hãy thử mô hình này:

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; 
     }; 
    } 
}); 

Sau đó, khi tiêu thụ các dịch vụ, làm

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

Cách tiếp cận tốt đẹp, +1 – tymeJV

+1

@ zsong phương pháp thành công làm gì ở đây? Nó không trả về data.members cho người tiêu dùng (vì bạn cũng phải viết data.members một lần nữa) – Todilo

Các vấn đề liên quan