以下控制器可以正常工作。
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
,还有什么选择?
答案 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);
}
}]);