Данные области Angular Access для фабрики?

У меня есть ситуация, когда я получаю данные о прокрутке из службы. Теперь мне нужно отфильтровать данные, используя популярные данные и последний пост.

Вот мой сервис:

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. изначально тип списка установлен на last , но он показывает undefined. Итак, каким будет лучший способ добиться этого?

Обновление:

Теперь я могу получить доступ к данным области в службе angular, но здесь возникает небольшая проблема: щелкните по списку, предыдущий элемент в области не становится пустым, а новые элементы помещаются в область.

Таким образом, спрос находится в списке, нажмите, чтобы предыдущие данные стали равными нулю, а новые попали в область действия.


person Anil Sharma    schedule 29.05.2014    source источник


Ответы (3)


Передайте $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();
  }  
});

Плункер

person Mahesh Sapkal    schedule 29.05.2014
comment
Привет, у меня простая проблема, можешь проверить? проверить обновленный вопрос - person Anil Sharma; 29.05.2014
comment
Вы ответили на вопрос ОП в самом строгом смысле этого слова, но зачем использовать $rootScope, когда вы уже вводите фабрику в контроллер (т.е. они могут без проблем обмениваться данными)? - person Marc Kline; 29.05.2014

Избегайте использования $rootScope - это плохая практика, очень похожая на использование объекта head в чистом JS. Вы уже можете обмениваться данными между фабрикой и контроллером, так почему бы просто не сделать listtype свойством фабрики:

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

и используйте его в своем контроллере, как и другие свойства:

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

Демонстрация ‹ -- запросы ajax не работают по очевидным причинам

person Marc Kline    schedule 29.05.2014

$scope недоступен для внедрения в службы, однако вы можете передать его, используя такие параметры.

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

затем в контроллере

Hututoo.set($scope.anyVar);
person atinder    schedule 29.05.2014