$scope.showButton = users.is_admin() && !document.is_provided;
然后在同一个控制器中,您有一个更新Document.is_provided值的按钮:
<button ng-click="document.is_provided = true;">Provide document</button>
问题是$scope.showButton现在应该改变但它没有改变.
更新:
Plnkr显示简化问题:http://plnkr.co/edit/Qk2jnHAmqsrNXSAjDYEk?p=preview
解决方法
Angular有一个称为Digest循环的东西.它是一系列连续调用的函数,以确保如果变量A与另一个变量B双向绑定(例如使用ng-model),它们始终保持同步(即,始终具有相同的值) ). angular提供的函数(或通常以$开头的服务,如$timeout等)自动启动摘要周期
所以我们假设你有一个变量A并且你将它绑定到$scope变量B,它等于变量C.你会期望C也被绑定到A,对吧?因为你认为当你改变C时,B应该改变,所以A也应该改变.但这只有在您开始摘要周期时才有可能.该循环将查找需要更新的变量,并将更新它们.但是,通过简单地更改C的值,您将永远不会触发摘要周期,因此您的更改将永远不会传播到A.
当你在$watch中添加一个变量时你所做的是(如$建议的那样),你强行开始一个摘要周期.所以现在当你改变C时,你开始循环,它追踪它也需要更新A,这就是它的工作原理.
在您的示例中,$scope.showButton绑定到document.is_provided.现在,您正在使用非角度函数来更改document.is_provided的值.这意味着您不会触发摘要周期,这意味着您的更改永远不会传播到$scope.showButton.因此,showButton始终保持错误.
当然,还有一个例子可以帮助您理解:
http://jsbin.com/vojoso/edit?js,output
观看控制台.我添加了日志以帮助您理解.
注释掉$watch语句,看看会发生什么.
尝试理解它然后自己做,你会得到它.
希望我帮助:)