0

我有一种情况,我从服务中获取滚动数据。现在我需要使用流行数据和最新帖子过滤数据

这是我的服务:

App.factory('Serviec', function ($http, $rootScope) {
    var Hututoo = function () {
        this.items = [];
        this.busy = false;
        this.after = 'Serviec_0';
    };

    Serviec.prototype.nextPage = function () {
        if (this.busy) return;
        this.busy = true;
        // return undefined  
        console.log($rootScope.listtype);
        $http.get(baseurl + 'ajax/gethome?after=' + this.after).success(function (data)               {
            var items = data;
            for (var i = 0; i < 5; i++) {
                this.items.push(items[i]);
                // debugger;
            }
            this.after = "Hututoo_" + this.items.length;
            this.busy = false;
        }.bind(this));
    };
    return Serviec;
});

在控制器中:

$scope.data= new Serviec();

$scope.listtype= 'latest';
$scope.changelist = function(str){    
       $rootScope.listtype = str;   
   $scope.data.items=[];            
   $scope.data.after = 'Serviec_0';           
         $http.post(baseurl+"ajax/gethome","after="+$scope.hututoo.after+"&list="+str).success(function(data){
            $scope.data.items = data;
           }); 
}

html

<li ng-click="expression = 'latest';changelist('latest');" ng-class="{latest_icon:expression == 'latest'}">Latest Hoot</li>
<li ng-click="expression = 'popular';changelist('popular');" ng-class="{popular_icon:expression == 'popular'}">Popular Hoots</li>

所以通过这些点击我需要订购数据。我必须根据用户点击进行http调用来获取数据。

我在想我可以制作一个定义列表类型的范围数据并在工厂中获取它。

我如何在 Serviec Factory 中注入这个范围。我已经使用 rootscope 进行了尝试。最初列表类型设置为 latest ,但它显示未定义。那么实现这一目标的最佳方法是什么?

更新

现在我可以在角度服务中访问范围数据,但是这里出现的小问题是在列表中单击范围内的上一个项目不会为空,并且新项目会被推入范围。

因此,需求在列表中单击以前的数据变为零,新的数据被推入范围。

4

3 回答 3

1

避免使用$rootScope-- 这是不好的做法,就像在纯 JS 中使用 head 对象一样。您已经能够在工厂和控制器之间共享数据,所以为什么不创建listtype工厂的属性:

var Hututoo = function () {
    ...
    this.listtype = 'latest';
};

并在您的控制器中使用它,因为您是其他属性:

$scope.changelist = function(str){    
    $scope.hututoo.listtype = str;
    ...
};

演示<-- ajax 请求因明显原因而不起作用

于 2014-05-29T16:56:16.757 回答
1

传递$rootScope给控制器​​并根据需要设置列表类型。

App.controller('MainCtrl', function($scope, $rootScope, Hututoo) {

  $scope.hututoo = new Hututoo();

  $scope.listtype= 'latest';
  $scope.changelist = function(str){
      $rootScope.listtype= str;
      $scope.hututoo = new Hututoo();
      $scope.hututoo.nextPage();
  }  
});

普朗克

于 2014-05-29T14:57:42.613 回答
0

$scope 不可用于注入服务,但是您可以使用像这样的参数传递它。

app.factory('Hututoo', function ($resource) {
    var somePrivateVar = [];
    return {
        set: function(scopeVar){
            somePrivateVar.push(scopeVar);
        },
        get: function(){
            return somePrivateVar;
        }
    }
});

然后在控制器中

Hututoo.set($scope.anyVar);
于 2014-05-29T14:24:13.630 回答