如果使用此语法:<div ng-controller="BuildingsCtrl as bc">的目的是避免使用$scope(显然是it is),那么我应该如何使用$http

也就是说,如何重新编写以下代码以不使用$ scope?

angular.module('atlasAngularApp')
    .controller('BuildingsCtrl', function ($scope, $http) {
        this.awesomeThings = [
            'HTML5 Boilerplate',
            'AngularJS',
            'Karma'
        ];
        this.getBuildings = function () {
            $http.get('http://localhost:40602/api/1.0/buildings')
                .then(function successCallaback(response) {
             ======>    $scope.buildings = response.data;
                    }, function errorCallback(response) {
                        alert("Error");
                }
            );
       }
   });


为了详细一点,

<li ng-repeat="thing in bc.awesomeThings">
    {{ thing }}
</li>


this.awesomeThings可以正常使用,因此视图可以使用this,但是以下操作无效:

angular.module('atlasAngularApp')
    .controller('BuildingsCtrl', function ($http) {
        var self = this;
        this.getBuildings = function () {
            $http.get('http://localhost:40602/api/1.0/buildings')
                .then(function successCallaback(response) {
             ======>    self.buildings = response.data;
                    }, function errorCallback(response) {
                        alert("Error");
                }
            );
       }
   });


(注意self.buildings位。)

我已经按照这些主题尝试了多种变体,但到目前为止没有任何效果。 This问题与此类似,但是我无法使其适应我的代码。

我可能应该补充一点,我没有反对$scope的任何东西,我只是在尝试做一些由yeoman生成的angular认可的方式。我还想解释一下为什么$scope可能被认为是一件坏事。

为了完整起见,这是我的观点。也许有什么问题吗?

<div ng-controller="BuildingsCtrl as bc">
    <table ng-init="buildings = bc.getBuildings()">
        <tr ng-repeat="building in buildings">
            <td>{{ building.name }}</td>
            <td>{{ building.code }}</td>
            <td>{{ building.image }}</td>
        </tr>
    </table>
</div>


只要我使用$scope,代码就可以工作

最佳答案

您正在创建ng-init="buildings = bc.getBuildings()",但未返回任何内容绑定到buildings,而是将值间接分配给self.buildings。因此,您对this.buildings的重复无效。现在,当您分配给buildings时,this.buildings就是您在视图中实际引用的内容。
所以,

<tr ng-repeat="building in bc.buildings">


重复您的元素。

至于使用bc.buildings$scope的答案。没有比这里更好的解释了:'this' vs $scope in AngularJS controllers

10-08 15:36