JavaScript`bind`方法无法按预期工作

时间:2015-06-09 12:08:46

标签: javascript angularjs bind

以下控制器可以正常工作。

 app.controller('foo', ['$scope',function ($scope) {
        $scope.delete = function(){
            bar($scope);
         }
    }]);

我尝试使用bind

让它变得更干净
 app.controller('foo', ['$scope',function ($scope) {
        $scope.delete = bar.bind(null, $scope);
    }]);

不幸的是,这个表单没有按预期工作,并且$scope总是在绑定方法(此处为bar)中提供旧版本的$ scope,即使$ scope已更改为引用不同的价值。这有什么问题?

还有什么?

如果我不在这里使用bind,还有什么选择?

5 个答案:

答案 0 :(得分:10)

我认为您的问题是,即使在Util.bar更改为引用其他值后,您的绑定$scope始终也会提供旧版$scope

bind绑定,而非绑定变量。您将 $scope 的当前值绑定到Util.bar。另一方面,每次函数运行时,您的第一个样式强制将标识符$scope解析为值(或实际上是外部作用域变量记录)。

如果$scope更改为引用完全不同的值,则必须使用第一个表单。 .bind(null, $scope)会立即将$scope解析为值并永久使用该值,而没有bind的第一个表单会在每次运行函数时将$scope解析为值。

答案 1 :(得分:4)

看看这个Plunker

   $scope.delete1 = function(){
      bar($scope);
   };

   $scope.delete2 = bar.bind(null, $scope);

   $scope.delete3 = function(){
      bar(this);
   };

对我而言,它似乎完全符合它的行为:delete1和delete2似乎在父控制器和子控制器上做同样的事情。删除3的行为有所不同 - 在这个答案中可以很好地解释原因:controller's scope

也许您可以确切地指定您发现错误的行为(用例)。返回链接是这样你可以离开控制器页面,然后回到控制器的新实例(和一个新范围 - 你可以从$ scope。$ id看到)。

答案 2 :(得分:2)

您确定>>> izero = np.r_[-1, (ts == 0).nonzero()[0]] # indices of zeros >>> idx = np.arange(len(ts)) >>> idx - izero[np.searchsorted(izero - 1, idx) - 1] array([1, 2, 0, 1, 2, 3, 4, 0, 1, 2]) 没有使用bar中的任何内容吗?这样做:

Util

答案 3 :(得分:1)

正如上面的apsillers回答中提到的,绑定方法在赋值时立即被评估 - 因此$ scope的当前值被绑定为传递给bar函数的参数。至于清洁工'替代方案,我不明白为什么你需要更清洁的东西':你正在寻找将$ scope.delete作为一个函数来调用当前$ scope值的bar,你当前的如果你仍然在寻找一些更精简的代码,那么你总是可以采用ES6胖箭头语法(但是你需要像babel这样的转换器) - 所以你的代码看起来像:

app.controller('foo', ['$scope',function ($scope) {
    $scope.delete = () => bar($scope);
}]);

答案 4 :(得分:-1)

正如@apsillers所说,在绑定$ scope中得到解析并在后续调用中使用,所以更清晰的方式是第一个但仍然如果你想使用bind然后使用

app.controller('foo', ['$scope',function ($scope) { 
     $scope.delete = function(){ 
         bar.bind(null, $scope); 
     }
}]);