Angularjs $http服务未更新视图

Angularjs $http服务未更新视图,angularjs,angularjs-http,Angularjs,Angularjs Http,我有两个控制器,一个嵌套在另一个里面。ParentController有一个我在ChildController中使用的对象,因为它在child中直接可用。现在,在child中,我调用$http服务,然后更新这个对象。我认为它应该更新视图 我尝试调用$scope.$apply()promise success函数,但我想我不太明白如何使用这个函数。如何在不刷新页面的情况下更新DOM 我还阅读了有关在$scope.$apply()内调用$http服务的内容。怎么做 $scope.addVideo

我有两个控制器,一个嵌套在另一个里面。ParentController有一个我在ChildController中使用的对象,因为它在child中直接可用。现在,在child中,我调用$http服务,然后更新这个对象。我认为它应该更新视图

我尝试调用$scope.$apply()promise success函数,但我想我不太明白如何使用这个函数。如何在不刷新页面的情况下更新DOM

我还阅读了有关在$scope.$apply()内调用$http服务的内容。怎么做

 $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
    语法安装的吗?涉及的作用域是隔离作用域还是继承作用域?对此问题我很抱歉。我已经用一些代码片段更新了这个问题。谢谢!你的评论非常有用!谢谢你的评论非常有用!