Angularjs $http服务未更新视图
我有两个控制器,一个嵌套在另一个里面。ParentController有一个我在ChildController中使用的对象,因为它在child中直接可用。现在,在child中,我调用$http服务,然后更新这个对象。我认为它应该更新视图 我尝试调用$scope.$apply()promise success函数,但我想我不太明白如何使用这个函数。如何在不刷新页面的情况下更新DOM 我还阅读了有关在$scope.$apply()内调用$http服务的内容。怎么做Angularjs $http服务未更新视图,angularjs,angularjs-http,Angularjs,Angularjs Http,我有两个控制器,一个嵌套在另一个里面。ParentController有一个我在ChildController中使用的对象,因为它在child中直接可用。现在,在child中,我调用$http服务,然后更新这个对象。我认为它应该更新视图 我尝试调用$scope.$apply()promise success函数,但我想我不太明白如何使用这个函数。如何在不刷新页面的情况下更新DOM 我还阅读了有关在$scope.$apply()内调用$http服务的内容。怎么做 $scope.addVideo
$scope.addVideo = function (data) {
console.log('scope tutorial', tutorial);
$http.post('/tutorials/' + tutorial.id + '/videos/', $scope.formData)
.then((response) => {
$window.tutorial.videos.push(response.data.video);
window.location = '/tutorials' + tutorial.id;
})
}
现在,在UI中,我使用的是TutorialController,它负责添加教程。我的意思是它是一种形式,它只适用于形式。在本教程中还有显示视频的VideoController
<div ng-controller="TutorialsController">
// add video in this tutorial logic
<ol ng-repeat="vid in tutorial.videos" ng-controller="VideoController">
<li>{{vid.title}}</li><button>Delete</button>
</ol>
</div>
//在本教程中添加视频
{{vid.title} 删除
当视频由父级添加时,我想更新子级,当子级VideoController使用删除按钮删除视频时,我想将其从父级范围中删除。考虑到您没有编写完整的代码,我做了一些猜测,并为您准备了一些内容。您应该尽量不要使用$scope。$apply,除非您绝对确定需要它,否则大多数时间angular都会为您触发摘要循环,因此不需要使用$scope。$apply。最重要的是,您可以使用
$scope.$emit
来发出要删除的视频的值
$scope.addVideo = function (data) {
console.log('scope tutorial', tutorial);
$http.post('/tutorials/' + tutorial.id + '/videos/', $scope.formData)
.then((response) => {
̶$̶w̶i̶n̶d̶o̶w̶.̶t̶u̶t̶o̶r̶i̶a̶l̶.̶v̶i̶d̶e̶o̶s̶.̶p̶u̶s̶h̶(̶r̶e̶s̶p̶o̶n̶s̶e̶.̶d̶a̶t̶a̶.̶v̶i̶d̶e̶o̶)̶;̶
$scope.tutorial.videos.push(response.data.video);
̶w̶i̶n̶d̶o̶w̶.̶l̶o̶c̶a̶t̶i̶o̶n̶ ̶=̶ ̶'̶/̶t̶u̶t̶o̶r̶i̶a̶l̶s̶'̶ ̶+̶ ̶t̶u̶t̶o̶r̶i̶a̶l̶.̶i̶d̶;̶
})
}
如果您不熟悉$emit,请检查此项以了解更多详细信息(您也可以检查$broadcast,它将从上到下发送事件-与$emit相反):
因此,在您的情况下,请放入视频控制器
类似的内容:
$scope.deleteVideo = function(video) {
$scope.$emit('deleteVideo', video);
};
在tutorialcontroller
中,您需要收听与此类似的更改-数据参数将从子控制器获取视频对象:
$scope.$on('deleteVideo', (event, data) => {
$scope.tutorial.videos = $scope.tutorial.videos.filter(video=>!angular.equals(video,data));
});
上述操作将从$scope中删除视频-因此您需要添加$http逻辑
我简化了您的视频,在每个视频对象上添加了someProperty
,以及用于显示标题的title
,现在一切都在那里,只是为了展示如何通过$emit/$broadcast在控制器之间轻松通信
下面是关于小提琴的简化示例:
此外,我建议您查看Todd格言的样式指南,并开始使用基于组件的体系结构。这是目前最好的AngularJS风格在线指南:
希望能有帮助。
干杯 考虑到您没有编写完整的代码,我做了一些猜测并为您准备了一些东西。您应该尽量不要使用$scope。$apply,除非您绝对确定需要它,否则大多数时间angular都会为您触发摘要循环,因此不需要使用$scope。$apply。最重要的是,您可以使用
$scope.$emit
来发出要删除的视频的值
如果您不熟悉$emit,请检查此项以了解更多详细信息(您也可以检查$broadcast,它将从上到下发送事件-与$emit相反):
因此,在您的情况下,请放入视频控制器
类似的内容:
$scope.deleteVideo = function(video) {
$scope.$emit('deleteVideo', video);
};
在tutorialcontroller
中,您需要收听与此类似的更改-数据参数将从子控制器获取视频对象:
$scope.$on('deleteVideo', (event, data) => {
$scope.tutorial.videos = $scope.tutorial.videos.filter(video=>!angular.equals(video,data));
});
上述操作将从$scope中删除视频-因此您需要添加$http逻辑
我简化了您的视频,在每个视频对象上添加了someProperty
,以及用于显示标题的title
,现在一切都在那里,只是为了展示如何通过$emit/$broadcast在控制器之间轻松通信
下面是关于小提琴的简化示例:
此外,我建议您查看Todd格言的样式指南,并开始使用基于组件的体系结构。这是目前最好的AngularJS风格在线指南:
希望能有帮助。
干杯 请记住,在大多数地方(控制器、服务)$apply已经由处理事件的指令为您调用。只有在实现自定义事件回调或使用第三方库回调时,才需要显式调用$apply。当询问由代码引起的问题时,如果您提供人们可以用来重现问题的代码,您将得到更好的答案。请看。这在很大程度上取决于“更新对象”所使用的方法。没有更多信息,tbis的问题太广泛了。这两个控制器是如何安装的<代码>ng控制器还是作为AngularJS组件的控制器?它们是用
controllerAs
语法安装的吗?涉及的作用域是隔离作用域还是继承作用域?对此问题我很抱歉。我已经用一些代码片段更新了这个问题。请记住,在大多数地方(控制器、服务)$apply已经被处理事件的指令调用。只有在实现自定义事件回调或使用第三方库回调时,才需要显式调用$apply。当询问由代码引起的问题时,如果您提供人们可以用来重现问题的代码,您将得到更好的答案。请看。这在很大程度上取决于“更新对象”所使用的方法。没有更多信息,tbis的问题太广泛了。这两个控制器是如何安装的<代码>ng控制器还是作为AngularJS组件的控制器?它们是用controllerAs
语法安装的吗?涉及的作用域是隔离作用域还是继承作用域?对此问题我很抱歉。我已经用一些代码片段更新了这个问题。谢谢!你的评论非常有用!谢谢你的评论非常有用!