2017-05-28 68 views
1

我花了两天的时间把我的头撞在桌子上,阅读博客文章,以及围绕我的问题提出的问题。我尝试了以下代码的几种变体,至今没有任何变化。我将不胜感激任何帮助。AngularJS服务中的变量未在视图中更新?

服务内部的taskList变量确实更新,但控制器中的taskList没有更新。

控制器

angular.module("TaskManager").controller("mainController", function ($scope, API) { 

    $scope.init = function() { 
     console.log("Initializing app"); 
     API.getTasks(); 

    } 


    $scope.tasks = API.taskList; 

    $scope.$watch(function(){return API.taskList}, function(newVal, oldVal){ 

     alert("This is tasklist in controller" + newVal); 
    }, true) 


}); 

服务

angular.module("TaskManager").service("API", function ($http, $rootScope) { 

    const apiKey = "PUH"; 
    var taskList = [1,2,3,4]; 
    const getTasks = function() { 
     $http.get("https://api.mlab.com/api/1/databases/jquerytaskmanager/collections/tasks?apiKey=" + apiKey).then(function (data) { 
      taskList = data; 
      console.log(taskList); 
     }); 
    }; 

    $rootScope.$watch(function(){return taskList}, function(newVal, oldVal){ 

     alert(taskList); 
     taskList = newVal; 


     console.log(taskList); 

    }, true) 

    return { 
     getTasks, 
     taskList 

    } 
}); 

查看

<div class="row"> 
    <div class="col s12"> 

     <ul id="mainMenu" class="right hide-on-med-and-down"> 
      <li><a class="waves-effect waves-light btn blue darken-4"><i class="fa fa-bars" aria-hidden="true"></i> Menu</a></li> 
      <li><a class="waves-effect waves-light btn blue darken-4"><i class="fa fa-plus" aria-hidden="true"></i> Add Task</a></li> 
      <li><a class="waves-effect waves-light btn blue darken-4"><i class="fa fa-pencil" aria-hidden="true"></i> Manage Categories</a></li> 
     </ul> 

    </div> 

</div> 

<div class="mainContainer container"> 
    <div class="row"> 
     <div class="col 6"> 
      <h2>Tasks</h2> 



     </div> 

    </div> 



      <ul> 
       <li class="taskContainer" ng-repeat="task in tasks" > 

        <div class="row"> 
         <div class="col s6"> 
          <span class="taskName"> {{task.task_name}}</span> 
         </div> 

         <div class="col s6"> 
          <button class="btn blue darken-4 waves-effect waves-light ">Edit</button> <button class="btn red darken-4 waves-effect waves-light ">Delete</button> 
         </div> 

        </div> 


       </li> 

      </ul> 








</div> 

回答

1

返回$ HTTP从日承诺E服务:

app.service("API", function($http) { 
    this.getTasks = function() { 
     return $http.get(url); 
    }; 
}); 

然后,在控制器中,从许提取数据:

app.controller("mainController", function($scope, API) { 
    this.$onInit = function() { 
     console.log("Initializing app"); 
     API.getTasks().then(function(response) { 
      $scope.tasks = response.data; 
     });  
    }; 
}); 

有关详细信息,请参阅AngularJS $http Service API Reference

+0

Tha照顾它,你知道我的实现为什么不起作用吗? – Gregborrelly

+0

我建议将承诺作为处理异步API的最佳方法。与观察者进行脏检查效率低下。传递稍后用数据填充的引用依赖于脏检查才能工作。不要依赖观察者;只是使用承诺。 – georgeawg