【问题标题】:Can't access $scope variable in controller [duplicate]无法访问控制器中的 $scope 变量 [重复]
【发布时间】:2015-01-22 10:54:22
【问题描述】:

在我的控制器中,我调用了一个返回 JSON 对象的工厂:

function getData() {
    trainDataFactory.getData()
        .success(function (data) {
            $scope.dataList = data;
        })
        .error(function (error) {
            $scope.status = 'Unable to load data: ' + error.message;
        });
}

然后我就可以像这样访问视图中的 $scope.dataList(有效):

{{ dataList[0].UnitNumber }}

但我想在控制器中访问同一个变量,但它不起作用 - 角度会中断。

我在控制器的开头尝试这个:

init();
function init() {
    getData();

    console.log($scope.dataList[0].UnitNumber);

    $scope.firstDataListItem = $scope.dataList[0].UnitNumber;
}

getData() 被调用所以我不明白为什么 $scope.dataList 不可用??

【问题讨论】:

  • 你能发布整个控制器吗?您可能在包含 $scope 元素并从控制器的内部范围到达 getData() 方法时做错了。

标签: javascript angularjs asynchronous angularjs-scope promise


【解决方案1】:

getData() 中的数据检索将异步执行。当getData() 执行完毕后,它就不会可用了。

你需要使用 Promise:

function getData() {
    return trainDataFactory.getData()
    .then(function (response) {
        return response.data;
    })
    .catch(function (error) {
        throw new Error('Unable to load data: ' + error.message);
    });
}

function init() {    
    getData().then(function (data) {
        $scope.dataList = data;
        console.log(data[0].UnitNumber);
        $scope.firstDataListItem = data[0].UnitNumber;
    })
    .catch(function (error) {
        $scope.status = error.message;
    });
}

【讨论】:

  • 谢谢,这行得通。那么,当异步工作时,then 语句在检索数据后直接访问数据很重要吗?
  • 另外,这是否意味着使用 dataList 必须在 getData().then(function (data) { } 或 init() 函数之外访问它?
  • @JakkyD 是的,promise 和 then() 方法对于异步任务非常重要。我建议您有空时阅读this book。我不完全理解您的第二个问题,但通常,您应该在 then() 处理程序 somewhere 内执行异步任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多