【问题标题】:AngularJS: code not working when iterating through object [duplicate]AngularJS:迭代对象时代码不起作用[重复]
【发布时间】:2016-06-09 09:43:08
【问题描述】:

我正在尝试从模板中的控制器 empctrl 填充 employee 对象列表。

这是控制器:

app.controller('employeeController', function ($scope, employeeService) {

    this.employees = {};

    this.populateTable = function (data) {

        this.employees = data;
    };

    var error = function (err) {
        console.log("Error: " + err);
    };

    // Call Service to List all Employees
    console.log("Service called to populate table.");
    employeeService.output().then(this.populateTable, error);
    this.populateTable();

});

但是,我编写的这段代码不起作用:

<div ng-repeat="employee in empctrl.employees.allEmployees" class="table_row">
    <div class="table_column" style="width:2%">{{ $index + 1 }}</div>
    <div class="table_column" style="width:8%">{{ employee.employeeName}}</div>
    <!-- 7 more columns -->
</div>

用户界面中没有显示任何内容。
相反,如果我在控制器中写$scope.employees,它会起作用:

<div ng-repeat="employee in employees.allEmployees" class="table_row">

因为我知道在控制器中使用$scope.&lt;everything&gt; 是多么诱人,所以我尽量避免使用$scope


如果有人能证明$scope 的正确使用以及alias.abc$scope.abc 之间的区别(其中alias 是控制器的别名),我将不胜感激。

编辑:完全相同的问题是:'this' vs $scope in AngularJS controllers

感谢此链接,PankajParkar。

【问题讨论】:

  • 需要查看更多您的代码(至少是您的控制器代码)。 Fiddle/plunker/codepen 会很好。
  • @LJ.Wizard 您需要哪部分代码?我会添加它。
  • 您的控制器代码 - empctrl 看起来。我假设您使用的是controller as 语法?
  • 你用过ng-controller="employeeCtrl as empctrl"吗(类似这样的东西,假设控制器名称为employeeCtrl
  • @PankajParkar 是的,我愿意。

标签: angularjs scope angularjs-ng-repeat angularjs-controller angularjs-controlleras


【解决方案1】:

问题是您在populateTable 函数中访问的this 不是您在控制器函数中的this

最好将this 变量保留在某个变量中,这样您就可以确保您引用的是正确的对象。

控制器

app.controller('employeeController', function ($scope, employeeService) {
    var vm = this;
    vm.employees = {};

    vm.populateTable = function (data) {
        vm.employees = data;
    };

    var error = function (err) {
        console.log("Error: " + err);
    };

    // Call Service to List all Employees
    console.log("Service called to populate table.");
    employeeService.output().then(vm.populateTable, error);
    vm.populateTable();
});

有关更多详细信息,我强烈建议您阅读this article

如果您对 thisscope 感到困惑,请继续阅读 this answer

【讨论】:

  • 所以如果我使用var vm = this,它也可以在函数内部工作?
  • @cst1992 yupe.. 试试看..
  • 如果我使用function() 语法而不是var x = function() 即只写一个声明,this 是否仍会引用函数而不是控制器?
  • 工作,谢谢。你能帮我解决别名与范围的问题吗?我想知道 $scope 是理想解决方案的场景。在这种情况下不是,但它必须在其他地方?
  • @cst1992 理想情况下,如果您问我该选择什么。我建议您关注this 而不是scope,因为最好使用视图中的别名访问范围变量& 会让你更接近 angular2 迁移。如果你想要更多细节,你可以参考this answer
【解决方案2】:

将您的变量添加到$scope 而不是this,例如:

$scope.customers = {};

$scope.populateTable = function (data) {
    $scope.employees = data;
};

编辑:这两种方法都有效。请参阅this article 以获得深入的解释。

【讨论】:

  • 您能解释一下原因吗?
  • 您绑定到$scope 的所有内容都将在您的视图中可用,这就是$scope 变量的设计目的。
  • @Ties 这不是正确的答案.. OP 想要做的是使用controllerAs 方法来处理它.. 这意味着他必须将变量绑定到this 上下文
  • 只是试图解释为什么这也是一个不错的选择。因为在函数上下文中使用 this 有时会很困难。
  • @Ties 谁说难?
【解决方案3】:

"this" 替换为 vm (View-Model) 将解决您的问题。不污染 $scope 对象是一件很时髦的事情。 this 是一个全局上下文,其值取决于函数调用。

所以,在你的控制器中分配,

var vm = this;
  vm.empTable = function (data) {
  vm.employeeList = data.data; 
};

..并在控制器的其他地方使用 vm 对象。在一个视图中使用多个控制器时,保持代码整洁会很有用。

别忘了给控制器起一个别名,

<div ng-controller="MainCtrl as main">
    <div ng-repeat=" employee in main.vm.employeeList ">
        {{employee.name}}
    </div>
</div>

【讨论】:

  • 谢谢vm的意思,我不知道。顺便说一句,使用任何名称都可以正常工作;我在自己的代码中使用Controller 来知道这个变量有控制器的this
  • 当然可以。任何名字都可以!
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 2018-10-22
  • 2013-03-21
  • 2014-04-16
  • 1970-01-01
  • 2016-02-24
  • 2021-10-27
  • 2015-10-23
相关资源
最近更新 更多