AngularJS:Service变量更改未应用

10 浏览
0 Comments

AngularJS:Service变量更改未应用

我目前遇到一个问题,即当我调用服务中的一个函数来改变它自己的内部变量时,除非我从控制器中改变它,否则它似乎不会保持。当我在改变变量后立即将其输出到控制台时,它显示了正确的值。然而,当我调用控制器中打印对象到控制台的函数时,它显示的是原始值。

我遇到问题的变量是"isSignedIn",它始终显示为false(通过登录控制器中的$scope.verify方法进行确认),即使在"console.log('Signin:' + isSignedIn);"显示为true之后也是如此。

感谢您提前的指导!

0
0 Comments

问题:AngularJS:服务变量的更改不起作用

原因:在调用服务(工厂)返回的值的地方,添加一个$watch。这将在服务中的值更改时更新该值。

解决方法:

$scope.$watch(function() { return ModalService.getInfo(); }, function(){
    $scope.info = ModalService.getInfo();
}); 

参考解决方案:查看解决方案

0
0 Comments

问题的出现的原因是返回的对象中的isSignedIn变量的值始终保持为false,不会随后面对isSignedIn变量值的更改而更新。解决方法是将isSignedIn变量的值通过一个函数暴露给外部,使用return { isSignedIn: function () { return isSignedIn; } }来返回对象。

在问题的更新代码中,{{skypeClient.state()}}的绑定并没有更新(除非有其他操作“强制”更新它)。这可能是因为该值的更新发生在Angular的digest周期之外,所以没有告诉Angular在正确的时机更新。可以尝试将state赋值的那一行代码包裹在$apply()中,以便让Angular更新绑定。

感谢您的快速回复!第一个问题:{{skypeClient.isSignedIn()}}的绑定在我的测试中是正常工作的,你不需要添加一个watch...你能否提供一些代码以便我们看到你的尝试是什么?第二个问题:你是对的,我刚刚注意到你使用的是service而不是factory -- 所以你应该使用"this"来填充而不是返回一个对象(你的函数是一个构造函数)。

我还注意到原始代码中有关使用this的一些混乱:例如,errors是在this上设置的,但isSignedIn不是。在signIn.then回调中,你引用了this.errorCount -- 我认为这个this是错误的this!在signOut中,你有this.isSignedIn -- 也似乎是错误的。一般来说,我发现使用factory而不是service更容易理解,只使用闭包,避免对this的困惑。这也可能有趣:When to use service instead of factory

另一个问题:AngularJS - The correct way of binding to a service properties

我已经根据您的建议将更新的代码添加到我的原始帖子中,并对输出及我想要做的事情进行了更简明的解释(无法在评论中找到代码发布的方法)。另外,这两个参考帖子非常有帮助!尽管我似乎无法成功使用它们,但希望这是我的错误。再次感谢您如此详细的回复,这是一个了不起的社区!

0