2015-07-03 3 views
3

Это было решено с использованием службы, а не фабрики, как описано на плунжере: http://plnkr.co/edit/uh23lrXz2mI4ukvJvxws?p=preview, предоставленной компанией @Incognos. Принятый ответ был @Tomislav, как он впервые упомянул об использовании сервиса.Услуги Angular.js

Я создал контроллер для обработки сохраняет элементы, они хранятся как такие (удалены повторений, чтобы сэкономить место здесь):

'use strict'; 

angular.module('angularStoreApp') 
    .controller('storeCtrl', function($scope){ 
    $scope.product = { 
     items: [ 
     { 
      qty: 0, 
      stock: 5, 
      price: 99.00, 
      name: 'Almond Toe Court Shoes, Patent Black', 
      category: 'Womens Footerwear' 
     } 
     ] 
    }; 
    }); 

Мне нужно создать службу для хранения этих данных так к нему можно получить доступ с другого вида/контроллера. (Это будет последняя страница корзины). Я попытался использовать .factory, затем в контроллере $ scope.products = serviceName.items; но безрезультатно. Я также добавил эту услугу через контроллер. Мне дана ошибка инжектора: modulerr.

Чтобы уточнить, услуга я создал это то этот

var app = angular.module("angularStoreApp", []); 

app.factory("StoreService", function() { 
    var products = { 
    items: [ 
     { 
     qty: 0 
     } 
    ] 
    }; 
    return products; 
}); 

Контроллер как таковой:

'использовать строгое';

angular.module('angularStoreApp') 
     .controller('storeCtrl', function($scope, StoreService){ 
    $scope.product = StoreService.items; 
    }); 

я застрял на том, как поместить свои данные из исходного контроллера на службу, а затем вводит услугу в контроллер для отображения элементов еще раз. Чтобы отметить, НЕ используя службу, данные отображаются в представлении отлично.

ответ

3

Не используйте фабрику, создайте службу, которая всегда является одноэлементной и будет хранить ваши данные:

var app = angular.module('angularStoreApp',[]); 

app.service('StoreService',function(){ 

    var products={ 
    items:[] 
    }; 

    this.save=function(item){ 
    products.items.push(item); 
    }; 

    this.get=function(){ 

    return products; 

    }; 
}); 

Вводят его в контроллере:

app.controller('storeCtrl',function($scope,StoreService){ 

    var item={qty:0} 

    StoreService.save(item); 

    $scope.product=StoreService.get(); 

    console.log($scope.product); 

}); 

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

+0

Чтобы расширить это. Службы являются «новыми», и тот же экземпляр сохраняется. Заводы просто возвращают функцию так, как она есть каждый раз, поэтому вы можете называть ее «самостоятельно», если хотите. – Seer

+0

@ Томислав, спасибо за это. Хотя, чтобы быть ясным, мне нужны данные, например qty, которые нужно сохранить, поэтому я могу использовать это в другом представлении позже, например, в тележке. Я вижу, что данные хранятся в контроллере? Поправьте меня, если я ошибаюсь, я новичок в угловой. –

+0

Он хранится в течение всего жизненного цикла страницы wab, а не в контроллере, а в сервисе. Вы можете ввести эту услугу позже в любом другом контроллере – Tomislav

0

Попробуйте это,

angular.module('angularStoreApp') 
     .controller('storeCtrl', function($scope, StoreService){ 
     $scope.product = StoreService; 
     }); 

но убедитесь, ваше приложение инициализируется только один раз.

var app = angular.module("angularStoreApp", []); 

эту линию, потом, должно быть,

angular.module("angularStoreApp"); 
+0

OP уже делает эту вещь –

+0

Эй, Z.a, я сделал первый. Я предполагаю, что вы хотите, чтобы я добавил var app = angular.module ("angularStoreApp", []); в контроллер? Он уже инициализируется только один раз в файле служб. Следует отметить, что они находятся в отдельных файлах в одном дочернем каталоге. Таким образом, services.js и StoreCtrl.js находятся в одном каталоге «store». –

+0

не имеет значения, где это действительно так. u следует использовать эту линию один раз и предпочтительно перед чем-либо еще, angular.module («angularStoreApp», []); никогда больше не используйте его с кронштейнами. u может сделать это, чтобы создать контроллеры, службы и т. Д. angular.module («angularStoreApp»). Контроллер, фабрика и т. Д. –

1

App сверху вниз с помощью службы:

// main.js 
var app = angular.module('app', []) 
.controller('buyerCtrl', function($scope, StoreService) { 
    $scope.items = StoreService.items(); 
    $scope.buyMe = function(item) { 
    StoreService.add(item); 
    }; 
}) 

.service("StoreService", function() { 
    var products = []; 
    var items = [{ 
    qty: 0, 
    stock: 5, 
    price: 99.00, 
    name: 'Almond Toe Court Shoes, Patent Black', 
    category: 'Womens Footerwear' 
    }, { 
    qty: 0, 
    stock: 5, 
    price: 99.00, 
    name: 'Black Lace Shoes, Patent Black', 
    category: 'Mens Footerwear' 
    }]; 
    this.items = function() { 
    return items; 
    }; 
    this.add = function(product) { 
    products.push(product); 
    }; 
    this.count = function() { 
    return products.length; 
    }; 
    this.cart = function() { 
    return products; 
    }; 
}) 

.controller('cartCtrl', function($scope, StoreService) { 
    $scope.cart = StoreService.cart(); 
    $scope.cartCount = StoreService.count(); 
}); 

см Plunkr (plunker обновлен, чтобы показать мульти-файл)

+0

Эй, спасибо за это, я добавил этот код к контроллеру, но он не позволяет ничего внутри вид магазина, который будет загружен, или любой другой вид. Кроме того, продукты var все еще выбрасываются как избыточная переменная. –

+1

Я отредактировал и преобразовал фабрику в сервис, как упоминалось @tomislav - вам нужно будет опубликовать дополнительный код, чтобы я мог помочь дальше. – Incognos

+0

Какой код вам нужен? –

0

Просто сделайте прямую ссылку на открытую коллекцию item, содержащуюся в каждом из контроллеров потребления, и непосредственно манипулируйте ссылкой.

Следующий пример использует эту модель и два контроллера, чтобы продемонстрировать поведение:

var module = angular.module('myapp', []); 
 
    
 
module.service('StoreService', function(){ 
 
this.items = 
 
    [ 
 
     { 
 
      qty: 0, 
 
      stock: 5, 
 
      price: 99.00, 
 
      name: 'Almond Toe Court Shoes, Patent Black', 
 
      category: 'Womens Footerwear' 
 
     } 
 
     ] 
 
    ; 
 
}); 
 
      
 
     
 
module.controller('element1Controller', function($scope, StoreService){ 
 
    $scope.items = StoreService.items; 
 
    
 
    $scope.add = function(){ 
 
    
 
    $scope.items.push({ 
 
      qty: 2, 
 
      stock: 10, 
 
      price: 9.00, 
 
      name: 'Random Item', 
 
      category: 'Womens Footerwear' 
 
     }); 
 
       
 

 
} 
 
}); 
 

 
module.controller('element2Controller', function($scope, StoreService){ 
 
    $scope.items = StoreService.items; 
 
});
<html ng-app='myapp'> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<div ng-controller="element1Controller"> 
 
    Controller 1<br /> 
 
    {{items}} 
 
    <br /> 
 
    <button ng-click='add()'>Add Item to Cart</button> 
 
    
 
</div> 
 

 
    <br /> 
 

 
    <div ng-controller="element1Controller"> 
 
    Controller 2<br /> 
 
    {{items}} 
 
</div> 
 
</html>

Смежные вопросы