Javascript AngularJS:ng重复不';更新数组后不刷新
我正在使用Ionic框架,并尝试使用以下HTML代码显示“Card”元素的列表:Javascript AngularJS:ng重复不';更新数组后不刷新,javascript,angularjs,ionic-framework,angularjs-ng-repeat,Javascript,Angularjs,Ionic Framework,Angularjs Ng Repeat,我正在使用Ionic框架,并尝试使用以下HTML代码显示“Card”元素的列表: <div ng-repeat="case in cases"> <div class="list card"> <div class="item item-avatar"> <button ng-click="rmpost(card.key)" style="background: transparent; border: none;
<div ng-repeat="case in cases">
<div class="list card">
<div class="item item-avatar">
<button ng-click="rmpost(card.key)" style="background: transparent; border: none;"><i class="icon ion-close-round"></i></button><!--if (dataSnapshot.val().volunteer_email == firebase.auth().currentUser.email)-->
<h2>{{card.volunteer_name}} ({{card.volunteer_email}})</h2>
<p>{{card.title}} ({{card.creationdate}})</p>
</div>
<div class="item item-body">
<img class="full-image" src={{card.snapshot}}>
<p>{{card.message}}</p>
</div>
</div>
</div>
$scope.cases在初始化为常量值时显示良好,但在动态更新(通过$push)时,不会显示任何内容。您需要包装
push
调用$apply
方法。因为您是从角度范围之外(从firebase回调)添加到数组项中的
请尝试以下操作:
...
firebase.database().ref('/cases')
.on('child_added', function(dataSnapshot)
{
$scope.$apply(function () {
$scope.cases.push({key: dataSnapshot.key,
volunteer_name: dataSnapshot.val().volunteer_name,
volunteer_email: dataSnapshot.val().volunteer_email,
title: dataSnapshot.val().title,
creationdate: '',//(new Date(dataSnapshot.val().creationdate)).toString(),
snapshot: dataSnapshot.val().snapshot,
message: dataSnapshot.val().message});
});
});
...
您需要包装您的
push
调用$apply
方法。因为您是从角度范围之外(从firebase回调)添加到数组项中的
请尝试以下操作:
...
firebase.database().ref('/cases')
.on('child_added', function(dataSnapshot)
{
$scope.$apply(function () {
$scope.cases.push({key: dataSnapshot.key,
volunteer_name: dataSnapshot.val().volunteer_name,
volunteer_email: dataSnapshot.val().volunteer_email,
title: dataSnapshot.val().title,
creationdate: '',//(new Date(dataSnapshot.val().creationdate)).toString(),
snapshot: dataSnapshot.val().snapshot,
message: dataSnapshot.val().message});
});
});
...
和马克比姆科的答案一样 我想补充一点,有一个更容易阅读的替代方案:
$scope.cases.push({key: dataSnapshot.key,
volunteer_name: dataSnapshot.val().volunteer_name,
volunteer_email: dataSnapshot.val().volunteer_email,
title: dataSnapshot.val().title,
creationdate: '',//(new Date(dataSnapshot.val().creationdate)).toString(),
snapshot: dataSnapshot.val().snapshot,
message: dataSnapshot.val().message});
$scope.digest();
和马克比姆科的答案一样 我想补充一点,有一个更容易阅读的替代方案:
$scope.cases.push({key: dataSnapshot.key,
volunteer_name: dataSnapshot.val().volunteer_name,
volunteer_email: dataSnapshot.val().volunteer_email,
title: dataSnapshot.val().title,
creationdate: '',//(new Date(dataSnapshot.val().creationdate)).toString(),
snapshot: dataSnapshot.val().snapshot,
message: dataSnapshot.val().message});
$scope.digest();
问题是您正在角度上下文之外更新模型。数据已经更改,但是angular没有运行它自己的内部摘要,也没有意识到模型中发生了任何更改
firebase.database().ref('/cases')
.on('child_added', function(dataSnapshot) //FIREBASE EVENT NOT WITHIN ANGULAR CONTEXT
您需要使用angular的$scope.$apply
方法
$rootScope.Scope#$apply
$apply([exp])$apply()用于以角度执行表达式
从角度框架的外部。(例如,来自浏览器DOM)
事件、设置超时、XHR或第三方库)因为我们是
调用角度框架,我们需要执行适当的范围
异常处理、执行监视的生命周期。
下面介绍如何使用$scope.$apply
进入有效的角度上下文,然后更新数据:
firebase.database().ref('/cases')
.on('child_added', function(dataSnapshot)
{
$scope.$apply(function() {
//we are now within the angular context, so any updates to the model with be handled correctly
$scope.cases.push({key: dataSnapshot.key,
volunteer_name: dataSnapshot.val().volunteer_name,
volunteer_email: dataSnapshot.val().volunteer_email,
title: dataSnapshot.val().title,
creationdate: '',//(new Date(dataSnapshot.val().creationdate)).toString(),
snapshot: dataSnapshot.val().snapshot,
message: dataSnapshot.val().message});
});
});
从理论上讲,您可以手动调用$scope.$digest
,但根据angular docs,这不是“推荐的”$apply
正确转发异常,并允许处理观察者。通常使用此方法比单独处理$digest
要好
$digest();处理当前作用域的所有观察者及其
儿童因为观察者的侦听器可以更改模型
$digest()一直调用观察程序,直到没有更多的侦听程序
开火。这意味着有可能进入无限循环。
如果
迭代次数超过10次
通常,您不会直接在控制器或中调用$digest()
指令。相反,您应该调用$apply()(通常从
指令),这将强制执行$digest()。
问题是您正在角度上下文之外更新模型。数据已经更改,但是angular没有运行它自己的内部摘要,也没有意识到模型中发生了任何更改
firebase.database().ref('/cases')
.on('child_added', function(dataSnapshot) //FIREBASE EVENT NOT WITHIN ANGULAR CONTEXT
您需要使用angular的$scope.$apply
方法
$rootScope.Scope#$apply
$apply([exp])$apply()用于以角度执行表达式
从角度框架的外部。(例如,来自浏览器DOM)
事件、设置超时、XHR或第三方库)因为我们是
调用角度框架,我们需要执行适当的范围
异常处理、执行监视的生命周期。
下面介绍如何使用$scope.$apply
进入有效的角度上下文,然后更新数据:
firebase.database().ref('/cases')
.on('child_added', function(dataSnapshot)
{
$scope.$apply(function() {
//we are now within the angular context, so any updates to the model with be handled correctly
$scope.cases.push({key: dataSnapshot.key,
volunteer_name: dataSnapshot.val().volunteer_name,
volunteer_email: dataSnapshot.val().volunteer_email,
title: dataSnapshot.val().title,
creationdate: '',//(new Date(dataSnapshot.val().creationdate)).toString(),
snapshot: dataSnapshot.val().snapshot,
message: dataSnapshot.val().message});
});
});
从理论上讲,您可以手动调用$scope.$digest
,但根据angular docs,这不是“推荐的”$apply
正确转发异常,并允许处理观察者。通常使用此方法比单独处理$digest
要好
$digest();处理当前作用域的所有观察者及其
儿童因为观察者的侦听器可以更改模型
$digest()一直调用观察程序,直到没有更多的侦听程序
开火。这意味着有可能进入无限循环。
如果
迭代次数超过10次
通常,您不会直接在控制器或中调用$digest()
指令。相反,您应该调用$apply()(通常从
指令),这将强制执行$digest()。
看起来您的代码缺少一些重要的细节。如何获得
dataSnapshot
变量?尝试使用$watch
并在更改时刷新。@JLRishe我更新了代码。请帮我个忙。@Fangs你能给我举个例子吗?你要把新的对象数组推到哪里?我做了一个简单的超时示例。看起来您的代码缺少一些重要的细节。如何获得dataSnapshot
变量?尝试使用$watch
并在更改时刷新。@JLRishe我更新了代码。请帮我个忙。@Fangs你能给我举个例子吗?你要把新的对象数组推到哪里?我做了一个简单的超时示例。尝试之后:我得到的是显示的空白数据,而不是dataSnapshot.val()中的数据。*@user6039980应该正常工作-控制台中有错误吗?抱歉,但您的答案是完美的。我忘了将{{card.*}}重命名为{{case.*}},这就是问题的原因。非常感谢,这很有帮助。我只想补充一点,ng click按钮不起作用。@user6039980很高兴能提供帮助!不幸的是,您的问题中没有足够的信息来解决ng click问题。我建议您为此问题打开一个附加问题,并提供附加详细信息。尝试之后:我将显示空白数据,而不是dataSnapshot.val()中的数据。*user6039980应该可以工作-控制台中有任何错误吗?抱歉,但您的答案是完美的。我念