在jQuery ajax调用之后,角度控制器范围不会更新

时间:2014-01-15 01:51:07

标签: javascript angularjs angularjs-scope

我有这个代码,我无法看到问题的根源在哪里,我没有在Chrome控制台中得到任何错误 我的控制员:

function notifController($scope) {
  $scope.refreshMsgs = function () {
    $.post("notification-center-trait.aspx")
      .success(function (data) {
        $("#loadedthings").html(data);
        newMsgs = JSON.parse($("#label1").html());
        $scope.msgs = newMsgs;
      });
  }
  $scope.refreshMsgs();
}

label1label2在div loadingthings中正确加载;

控制台中的newMsgs按其应有的方式进行解析;

我让它在其他页面上工作,但似乎我在这个上错过了一些东西。我有<html ng-app>标签:

<div ng-controller="notifController"> 
    <div class="row">
    {{msgs.length}} new msgs : 
              <table class="table">
                  <tbody >
                      <tr ng-repeat="msg in msgs">
                        <td>
                            {{msg.sender}}
                        </td>
                        <td>
                            {{msg.message}}
                        </td>
                        <td>
                            {{msg.date}}
                        </td>
                      </tr>
                  </tbody>
              </table>
</div>
</div>

执行此操作时,控制台中出现“未定义”:angular.element($0).scope()

1 个答案:

答案 0 :(得分:25)

忽略我在评论中指出的其他架构问题,真正的问题是您使用jQuery的{​​{1}}而不是Angular的ajax。当你不通过Angular做这样的事情时,你在Angular的范围之外工作,并且它不知道变化。虽然不理想,但您可以使用$http让角度知道在知识之外更新的内容。这看起来像这样:

$scope.$apply

这告诉Angular你从一个它不知道的上下文(在这种情况下是jQuery ajax调用)中修改了它需要知道的东西。

$scope.$apply(function() { $scope.msgs = newMsgs; }); 有一些有效用途,例如在事件处理程序中,但大多数情况下它都是不良做法的标志。你绝对应该使用Angular的$scope.$apply()进行ajax调用。