在$ scope.var更改后,Angular.js不刷新转发器,但仅在刷新后刷新

时间:2013-10-22 11:04:24

标签: javascript angularjs

我认为2种方式绑定是有角度的东西:

我可以从表单发布到控制器,如果我刷新页面,我会在页面上看到我的输入:

$scope.loadInput = function () {

    $scope.me.getList('api') //Restangular - this part works
    .then(function(userinput) {

        $scope.Input = $scope.Input.concat(userinput);
        // scope.input is being referenced by ng-repeater in the page 
        // so after here a refresh should be triggered.

    },function(response){
        /*@alon TODO: better error handling than console.log..*/
        console.log('Error with response:', response.status);
    });
};

在html页面中,ng-repeater遍历for i in input数组。但除非我刷新页面,否则不会显示表单中的新输入。

我很乐意为此提供帮助 - 谢谢!

1 个答案:

答案 0 :(得分:5)

尝试$scope.$apply

$scope.loadInput = function () {
        $scope.me.getList('api') //Restangular - this part works
        .then(function(userinput) {
               $scope.$apply(function(){ //let angular know the changes

                $scope.Input = $scope.Input.concat(userinput);
             });

            },function(response){
                /*@alon TODO: better error handling than console.log..*/
                console.log('Error with response:', response.status);
            });
    };

原因:你的ajax是异步的,它将在下一回合执行,但此时,你已经离开了角度循环。 Angular不知道这些变化,我们必须在这里使用$scope.$apply来进入角度循环。这种情况与使用$http等角度服务略有不同,当您使用$http服务并在.success内处理您的回复时,angular会知道这些更改。

DEMO不起作用。您会注意到第一次单击不会刷新视图。

setTimeout(function(){
             $scope.checkboxes = $scope.checkboxes.concat([{"text": "text10", checked:true}]);
         },1);
使用$scope.$apply

工作的

DEMO

setTimeout(function(){
            $scope.$apply(function(){
         $scope.checkboxes = $scope.checkboxes.concat([{"text": "text10", checked:true}]);
            });
        },1);