Angularjs 为什么这没有约束力?

Angularjs 为什么这没有约束力?,angularjs,binding,Angularjs,Binding,我正在学习所有关于角度的知识。我知道有很多关于角度绑定的问题,但我仍然在努力。也许有人能用这个例子让我更清楚 .controller('myCtrl',['$scope',function($scope){ //define dummy usermanager "class" var um = function(){ this.username = 'myUsername';

我正在学习所有关于角度的知识。我知道有很多关于角度绑定的问题,但我仍然在努力。也许有人能用这个例子让我更清楚

        .controller('myCtrl',['$scope',function($scope){

            //define dummy usermanager "class" 
            var um = function(){
                this.username = 'myUsername';
            };

            //init dummy user class 
            var _um = new um();

            //Bind usermanager to scope 
            $scope.UserManager = _um;

            //After three seconds set new username 
            setTimeout(function(){
                console.log('set');
                _um.username = 'newUsername';
            },3000);
        }]);
使用基本模板

<p>{{ UserManager }}</p> 
在本例中,它将始终读取{username:myUsername},并且从不更改为{username:newUsername}

在本例中,如何正确使用Angulars双向绑定

编辑:
似乎我可以使用$scope.$apply;但这似乎不是最好的方法。

$scope.UserManager指向对象

当您说_um.username='newUsername'时,这将更改_um对象属性的值。如果在此之后您尝试console.log$scope.UserManager.username,则输出良好

但是,当您说m.username='newUsername'时,Angular不知道在某些was中它会影响作用域上的数据。因此,它不会使用新的$scope值刷新DOM

您可以使用$scope调用它。$apply; 我建议不要


您可以学习AngularJS中的观察者-这可能会有所帮助。

$scope.UserManager指向对象

当您说_um.username='newUsername'时,这将更改_um对象属性的值。如果在此之后您尝试console.log$scope.UserManager.username,则输出良好

但是,当您说m.username='newUsername'时,Angular不知道在某些was中它会影响作用域上的数据。因此,它不会使用新的$scope值刷新DOM

您可以使用$scope调用它。$apply; 我建议不要


您可以了解AngularJS中的观察者-这可能会有所帮助。

AngularJS实际上在$apply调用中调用了几乎所有的代码。ng click、controller initialization、$http回调等事件都包装在$scope中。$apply。所以你不需要自己称呼它,事实上你不能。在$apply内调用$apply将抛出错误

如果要在新一轮中运行代码,您确实需要使用它。而且只有在这个转折点不是从AngularJS库中的方法创建的情况下

在新回合中,您应该将代码包装在$scope.$apply中。setTimeout将在延迟后的新回合中执行一个函数。由于Angular不知道该新转向,因此不会反映更新

因此,您的解决方案是使用$scope。$apply是完全合适的

            $scope.$apply(function(){
                _um.username = 'newUsername';
            })

AngularJS实际上在$apply调用中调用了几乎所有的代码。ng click、controller initialization、$http回调等事件都包装在$scope中。$apply。所以你不需要自己称呼它,事实上你不能。在$apply内调用$apply将抛出错误

如果要在新一轮中运行代码,您确实需要使用它。而且只有在这个转折点不是从AngularJS库中的方法创建的情况下

在新回合中,您应该将代码包装在$scope.$apply中。setTimeout将在延迟后的新回合中执行一个函数。由于Angular不知道该新转向,因此不会反映更新

因此,您的解决方案是使用$scope。$apply是完全合适的

            $scope.$apply(function(){
                _um.username = 'newUsername';
            })

正如其他人指出的,angular不知道$scope中的变化。您应该改为使用它,它将函数包装在$apply中


正如其他人指出的,angular不知道$scope中的变化。您应该改为使用它,它将函数包装在$apply中


上述评论是100%正确的。当您使用angular时,您需要使用angular的包装服务b/c,它将触发应用/摘要循环,这就是双向绑定工作的原因。这里是所有角度服务的链接。谢谢,我的问题应该更直接地说明我到底想要什么。我实际上是在处理$http,但为了清晰起见,我试图简化这个问题。你的回答确实帮助我更好地理解了这个循环。你应该为其他遇到这个问题的人提供更多关于摘要周期的信息[尽管我知道已经在很多地方讨论过这个问题],上面的评论是100%正确的。当您使用angular时,您需要使用angular的包装服务b/c,它将触发应用/摘要循环,这就是双向绑定工作的原因。这里是所有角度服务的链接。谢谢,我的问题应该更直接地说明我到底想要什么。我实际上是在处理$http,但为了清晰起见,我试图简化这个问题。你的回答确实帮助我更好地理解了这个循环。您应该为其他遇到此问题的人提供更多关于摘要周期的信息[尽管我知道在很多地方已经讨论过这个问题]