Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery ajax调用后角度控制器作用域未更新_Javascript_Angularjs_Angularjs Scope - Fatal编程技术网

Javascript jQuery ajax调用后角度控制器作用域未更新

Javascript jQuery ajax调用后角度控制器作用域未更新,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我有这段代码,我看不出问题的根源在哪里,我在chrome控制台中没有得到任何错误 我的控制器: function notifController($scope) { $scope.refreshMsgs = function () { $.post("notification-center-trait.aspx") .success(function (data) { $("#loadedthings").html(data); newMs

我有这段代码,我看不出问题的根源在哪里,我在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();
}
label1
label2
在div-loadedthings中正确加载

控制台中的newMsgs被正确地解析

我让它为其他页面工作,但似乎我错过了这一页上的某些内容。我有
标签:

<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>

{{msgs.length}}新的msgs:
{{msg.sender}
{{msg.message}
{{msg.date}

当我执行此命令时,控制台中出现了“未定义”:
angular.element($0).scope()

忽略我在评论中指出的其他架构问题,真正的问题是您使用的是
jQuery
ajax
,而不是angular的
$http
。当你不通过Angular做类似的事情时,你在Angular的范围之外工作,它不知道有什么变化。虽然不理想,但您可以使用
$scope.$apply
让angular知道某些内容在其知识范围之外进行了更新。看起来是这样的:

$scope.$apply(function() {
  $scope.msgs = newMsgs;
});
这就告诉Angular,您已经从它不知道的上下文(本例中的jQueryAjax调用)修改了它需要知道的内容


$scope.$apply()
有一些有效的用法,例如在事件处理程序中,但大多数情况下,这是不良做法的标志。您肯定应该使用Angular的
$http
进行ajax调用。

您确定
$0
有效吗?。我不知道你在做什么…我测试了你的代码,这里的一切都很好。我怀疑你不恰当地干扰了DOM,犯了一个错误。类似于
angular.element的任何内容都属于指令。Angular使scope属性在您需要的任何地方都可用,除了极少数例外,因此您不需要以这种方式访问元素或范围。@m59我刚刚在chrome控制台中执行了
Angular.element($0).scope()
,只是为了查看我的范围内发生了什么,但正如我所说的,我得到了“未定义”的代码,控制器已初始化,数据绑定正在工作。您遇到的问题在此代码中没有传达。为了绝对确定,请这样做:
$scope.foo='test'
,并在标记中:
{{foo}
。也许你的ajax电话就是打不通?如果控制器确实不工作,那么问题就出在其他方面(不在本代码中)。您刚才描述的内容甚至都无效。。。。那必须是
{{foo}}
。我敢肯定,您肯定有一个简单的错误,可以用控制台调试。另外,Angular为ajax调用提供了
$http
,您应该使用它而不是jQuery。作为附录,$scope.$apply如果在错误的时间使用它,可能会抛出错误(您不能将它放在任何地方,作为所有错误的解决方案),但是,$timeout(setTimeout的Angular包装器)将一直运行,并确保您的更改最终出现在下一个$apply pass中(无论如何,它们都会到达该位置)。它不应该被滥用,但它比$apply更安全,在指令中没有恶意攻击,可以检查它是否安全/需要。@Norguard True…但如果您在它抛出错误的地方使用
$apply
,则根本不应该使用它。这是一种巨大的代码气味。就像我说的,
$apply
通常根本不需要,除非您使用的是事件或第三方库。绝对不需要。但其中一些第三方库是半同步、半异步的,而另一些则是在pub/sub或setTimeout上钻自己的空子,或者只是要求你自己在这些圈子里绕着它们跳舞。我直接知道,如果你不小心,MasonryJS(用于pinterest/infinite tumble布局)和D3JS(用于制作tweenable SVG图形)都可以在
if(!$scope.$rootScope.$$phase)
无意义的情况下提供它们的痛苦,如果Angular只是部分地与过程联系在一起的话(就像在ng重复上调用Msnry.stamp+Msnry.layout…。
$timeout
非常优雅。