【问题标题】:Referencing a variable inside a function inside a $scope member function in angularjs在angularjs中的$ scope成员函数内引用函数内的变量
【发布时间】:2014-06-12 14:01:41
【问题描述】:

这更像是一个通用的 javascript 闭包和作用域函数,但我会在遇到它的 angular 上下文中询问它。假设我有以下控制器:

var Controller = function ($scope, factory) {
        $scope.Letter = 'A';

        /*
            Some other code
            .
            .
            . 
        */

        $scope.OnClick = function() {
            console.log($scope.Letter);
            SomethingWithCallBack('a param', 34, function() {
                console.log($scope.Letter);
            });
        }
};

假设在 $scope.Letter 更新的地方发生了一些事情,然后 OnClick 被触发。 OnClick 内部的 $scope.Letter 保持原始值。我可以通过将行更改为console.log(this.Letter); 来解决此问题。但是,我不能在SomethingWithCallBack() 的匿名函数中这样做。我目前通过为变量分配this.Letter 的值来解决问题,如下所示。

var myLetter = this.letter;
SomethingWithCallBack('a param', 34, function() {
    console.log(myLetter);
});

有没有办法在回调中引用“外部 this”,这样我就不必分配变量了?

【问题讨论】:

  • onclick 中的 $scope.letter 保持原值是什么意思?因为那不是真的。如果您更新 $scope.letter,那么它将是您调用 onClick 时的新值。现在,您似乎确实直接在作用域上使用了原语,所以这会给您带来继承作用域的问题,这可能会导致您认为它不会改变
  • “在示波器上使用原语”是什么意思?您的意思是原始的范围成员(整数字符串和日期)?
  • 正确。通过从子范围设置范围的原始值,将不会更改父范围值。子作用域将有自己的(同名)字段和自己的值。因此,您应该始终将对象放在您设置字段的范围内。

标签: javascript angularjs closures


【解决方案1】:

这是你编写javascript时的经典问题

您需要做的就是在附加事件侦听器之前将其存储在另一个变量中。

var that = this;
SomethingWithCallBack('a param', 34, function() {
    console.log(that.myLetter);
});

【讨论】:

  • 将它存储在另一个变量中可以使事情变得简单。希望有更好的方法。
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 2012-12-13
  • 2011-12-15
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
相关资源
最近更新 更多