Javascript jQuery ajax调用后角度控制器作用域未更新
我有这段代码,我看不出问题的根源在哪里,我在chrome控制台中没有得到任何错误 我的控制器: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
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
非常优雅。