【问题标题】:Can I access properties of a scope object within itself using "this"?我可以使用“this”访问范围对象自身的属性吗?
【发布时间】:2015-05-12 19:59:49
【问题描述】:

我需要得到以下例子的总数:

$scope.fees = {
    basic: 1,
    premium: 2,
    total: this.basic + this.premium
}

为什么这不起作用?它说this 未定义。有没有办法实现这一点而不必写出total: $scope.fees.basic + $scope.fees.premium

如果有办法缩短它,我会很高兴。

编辑:我实际上必须在$scope.fees 之外添加total 属性。 $scope.fees.total = ...

【问题讨论】:

  • 这个问题很不精确。它询问“如何访问”,但显然您知道 如何 - 您只是想缩短它。那么,答案是不是要用最少的字符来判断呢?更不用说,如果没有任何对AngularJS或“范围”标签的引用,就可以提出整个问题
  • 在处理完费用的右括号之前,$scope.fees 还不存在,因此无法访问。

标签: javascript angularjs object scope this


【解决方案1】:

你可以使用函数..

你好{{总计()}}
function FeeController($scope) {

    $scope.fees = {
    basic: 1,
    premium: 2,

};

  $scope.total = function() {
    return $scope.fees.basic  + $scope.fees.premium;
  };

}

【讨论】:

    【解决方案2】:

    为什么this.basic 不起作用

    this 在包含此语句的函数的上下文中进行评估。所以this 不是指$scope.fees 对象,而是指控制器。

    为什么total : $scope.fees.basic + $scope.fees.premium 也不起作用

    在评估表达式 $scope.fees.basic + $scope.fees.premium 的那一刻,$scope.fees 对象还不存在,因为您正在创建它。因此,它会导致类似“无法读取未定义的基本属性”的错误。

    如何解决这个问题

    除了您已经找到的解决方案之外,没有任何解决方案可以导致您想要的行为,所以很遗憾您必须坚持下去。

    【讨论】:

    • 谢谢,关于它的工作原理的解释最适合我。
    【解决方案3】:

    您可以考虑使用“控制器作为类”模式来减少您对 $scope 的依赖。你可以这样做:

    app.controller('FeeCtrl', function () {
      this.basic =1;
      this.premium =2;
      this.total = this.basic + this.premium;
    });
    

    然后你可以将这个控制器直接注入到你的 dom 中:

    <div ng-controller="FeeCtrl as fee">   
     {{ fee.total }} 
    </div>
    

    这里有更详细的说明

    http://toddmotto.com/digging-into-angulars-controller-as-syntax/

    【讨论】:

    • 你的建议不错,但控制器作为或范围在这里没有区别。如果您在示例中将$scope 替换为this,则基本相同。虽然至少控制器可以使事情变得更短,这似乎是 OP 的目标。
    • 除非你没有构造一个对象字面量,this.basic 等是立即可用的。
    • 是的,我明白了,但$scope 也一样。关键是对象文字不能以 OP 想要的方式使用,而不是控制器与 $scope 的行为不同,你不同意吗?
    • 同意,事实上,@Ramakrishna Kudikala 的答案是最接近于简单解决问题的方法,尽管我认为没有理由让 total 成为一个函数。
    • 没错,但我确实认为您的控制器作为建议是一个很好的控制器。随着 angular 2 范围的消失,除非您需要进行发射或广播,否则消除范围是一件好事,恕我直言。
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2020-11-20
    相关资源
    最近更新 更多