【问题标题】:Angularjs refresh view via $http.get service after database insertion数据库插入后,Angularjs 通过 $http.get 服务刷新视图
【发布时间】:2015-05-22 22:29:43
【问题描述】:

请帮忙!我正在为此拉头发。我为此尝试了很多教程,但似乎无法让任何东西远程工作。

用户可以在页面上添加/删除/更新用户信息,并且我希望在他们执行其中一项操作时刷新它。所有操作都写入数据库很好,我在取回值方面取得了各种成功,但我无法让视图实时更新。

我不能使用 $scope.$apply(); $digest 已经在处理中。我觉得我只是缺少一些主要的关键。

服务

angular.module('userlistFactory', [])
    .service('Data', function($http){
        this.list = function(){
            return $http.get('.../getUsers.php', {cache: true})  
            .then(function(data){
                return data.data;
            });
        }

控制器

userlistControllers.controller('UserListCtrl', ['$scope', 'Data', function ($scope, Data){

  Data.list().then(function (data) {   // Populates the page the first time through
    $scope.users = data;
  })

  $scope.$watch('Data.list()', function(newValue){  // At this point, I don't understand
    $scope.users = newValue;
  }, true);

查看

<tr ng-repeat-start="user in users| filter:query | orderBy:'id'">
    <td><a href="#/profile/{{user.id}}">{{user.id}}</a></td>
    <td>{{user.firstname}}</td>  // etc...

感谢阅读。

【问题讨论】:

  • $scope.$watch('Data.list()'有什么用?你怎么知道数据被插入/更新了?
  • 您的添加/更新/删除功能是否也在服务中?似乎如果您的列表功能正在工作,您可以在控制器中执行类似 Data.add(item).then(function() { Data.list(); } ) 的操作。您的手表不会让列表保持刷新。

标签: javascript angularjs angularjs-scope


【解决方案1】:

当您返回 $http 对象并在范围内设置回调时,无需在服务中处理回调,除非您想要处理 .fail() 或进行进一步处理。甚至可能是返回导致错误。

angular.module('userlistFactory', [])
.service('Data', function($http){
    this.list = function(){
        return $http.get('.../getUsers.php', {cache: true});
        }
    });

然后您调用获取用户看起来没问题,但它只会运行一次。如果要在数据库更改后调用它进行更新,则需要将其放入方法中

    function UpdateUsers(){         
      Data.list().then(function (data) {
         $scope.users = data;
         $scope.$apply();  //Because it was asynch
      });
    }

你可以去掉 $watch 部分。

现在,当您的用户添加、删除等操作时,您只需调用更新用户方法,同步请求就会启动。当它返回时,$scope.users 将被更新,并且 $scope.$apply() 将调用摘要循环来更新您的页面。

当然,您希望您的列表立即更新,就像在 cmets 中一样。为此,只需调用控制器中的方法即可。

    UpdateUsers();

$http 对象似乎有点令人困惑。您正在返回对象并通过添加 .then(.... 您正在注册您的回调。大多数代码示例一次显示了所有内容 $http(...).then(...) 但在您的情况下,您在服务中创建它并返回对象,然后您在控制器上注册回调。 $http ----> 回到控制器添加 .then(..) 所以你不需要在两者中处理它地方。你可以如何处理 .fail(... 任何你想要的地方,如果你需要处理它。

为了消除对 $watch 的一些混淆。 Angular 只关心绑定的东西。如果我有一个没有在任何地方使用的值,但我想在它发生变化时做一些事情,那么我需要 $watch 它以进行更改。那是因为没有事件或任何东西可以触发代码。当您将 $watch 绑定到某个东西时,它会自动添加 $watch,因为它会在摘要周期中为它 $watches,因此它可以更新它需要更新的任何内容。

【讨论】:

  • 最后我决定让我的 API 返回所有添加/删除/更新操作的完整用户列表。这就是我必须格式化这些操作的方式: $scope.updateUser = function(user) { Data.update(user).then(function(data){ $scope.users = data.data; }) } 我会给你是答案,因为它让我以不同的方式思考这个问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2012-12-31
  • 2015-02-02
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多