如何在angularjs中的函数之间使用$ scope?

时间:2016-01-26 08:46:54

标签: javascript angularjs

我想在一个控制器中使用函数之间的变量。 控制器: app.controller {.......

$http.get("json.php")
.success(function (response) {
    $scope.m = response.p;
    $scope.licznikm = $scope.m.length;
    $scope.date = new Date();
    $scope.openp = function (id, m) {
        ngDialog.open({
            template : 'formn.php',
            className : 'ngdialog-theme-default',
            backdrop : 'static',
        });
        $scope.name = m;
        $scope.id = id;
        console.log($scope.name); //is OK
        console.log($scope.id); // is OK
    };
    console.log($scope.miasta); //undefined
    console.log($scope.id); //undefined

2 个答案:

答案 0 :(得分:2)

http调用是异步的,这意味着下面的最终日志代码可能会在http调用完成并且值已设置之前运行。最简单的解决方案是确保在使用它们之前获得值,这可以通过在http成功后调用的回调中包含使用它们的代码来完成。例如

$http.get("json.php")
.success(function (response) {
    $scope.m = response.p;
    $scope.licznikm = $scope.m.length;  
    $scope.date = new Date();  
    $scope.openp = function (id,m) {
        ngDialog.open({ 
            template: 'formn.php',
            className: 'ngdialog-theme-default',
            backdrop : 'static',
        });
        $scope.name = m;
        $scope.id = id;
        console.log($scope.name); //is OK
        console.log($scope.id);   // is OK
       // a callback fn
        useNewValues();
    };
});

function useNewValues() {
    // should be the vals from http response now
    console.log($scope.name);
    console.log($scope.id);
}

答案 1 :(得分:0)

您可以随时保存承诺并使用它,以确保代码在完成之前不会运行。

var have_data = $http.get("json.php")
.then(function (response) {
    $scope.m = response.p;
    $scope.licznikm = $scope.m.length;
    $scope.date = new Date();
    $scope.openp = function (id, m) {
        ngDialog.open({
            template : 'formn.php',
            className : 'ngdialog-theme-default',
            backdrop : 'static',
        });
        $scope.name = m;
        $scope.id = id;
        console.log($scope.name); //is OK
        console.log($scope.id); // is OK
    });
 });

然后当你想要做任何其他需要你实际检索数据的事情时,只需用承诺包装它:

have_data.then(function() {
    console.log($scope.id);
});

如果已经提取了数据,该功能几乎会立即执行,如果尚未到达,它将在数据到达时立即执行。

您可以根据需要多次重复使用have_data承诺。