Проблема с изменением результата ngResource

В моем коде было следующее:

function store() {

    this.products = [
        new product("sku001", "Apple", "Tasty stuff", 1.00, "local"),
        ...
    ];

Это работало нормально для отображения всех продуктов:

<h3>Products</h3>
<b>Display products: {{store.products}}</b>
<div class="row"> 
    <div ng-repeat="product in store.products">
    <img ng-src="@Url.Content("~/Content/images/products/{{product.sku}}.png")" alt="{{product.name}}"><p></p>
    <p>{{product.description}}</p>
</div>

Продукты отображаются:

display_products

Теперь вместо жесткого кодирования значений я хочу загрузить их из успокоительного API:

function store($resource) {

    var Resource = $resource('/api/products/');

    this.products = Resource.query();

    console.log(this.products)

Это также, кажется, работает нормально, но форматирование значений немного отличается (прописные / разные имена ключей):

 [{"SKU":"sku001","Name":"Apple","ProductType":"local","Description":"Tasty stuff","Allowance":1073741824,"Price":1}]

Я хотел использовать данные, полученные от API, для создания массива объектов, соответствующего моему текущему форматированию, но у меня возникли некоторые проблемы:

function store($resource) {
    var Resource = $resource('/api/products/');

    this.products = Resource.query(function (data) {

        var product = {};
        var productsList = []
        for (i = 0; i < data.length; i++) {

            product = {
                sku: data[i].SKU,
                name: data[i].Name,
                description: data[i].Description,
                price: data[i].Price,
                category: data[i].ProductType
            }
            productsList.push(product);
        }
        return productsList;

    });

Когда я запускаю код, это выводится:

обновленное изображение

Как видите, отображаемый json не был изменен, и в результате описание / цена не отображаются.

Кто-нибудь знает, как я могу изменить данные, загруженные с помощью $resource, а затем отобразить их?

редактировать

controller.js

function storeController($scope, $routeParams, DataService) {
    // get store and cart from service
    $scope.store = DataService.store;
    $scope.cart = DataService.cart;
}

app.js

var storeApp = angular.module('AngularStore', ['ngRoute', 'ngResource']).
//route stuff
}]);

storeApp.factory("DataService", function ($resource) {

    var myStore = new store($resource);
    var myCart = new shoppingCart("AngularStore");

    // return data object with store and cart
    return {
        store: myStore,
        cart: myCart
    };
});

2 ответа

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

Чтобы использовать обещания с $resource, вам нужно использовать свойство $promise для возвращаемого значения.

function store($resource) {
    var Resource = $resource('/api/products/');

    Resource.query().$promise.then(
    //success callback
    function (data) {

        var product = {};
        var productsList = []
        for (i = 0; i < data.length; i++) {

            product = {
                sku: data[i].SKU,
                name: data[i].Name,
                description: data[i].Description,
                price: data[i].Price,
                category: data[i].ProductType
            }
            productsList.push(product);
        }
        this.products = productsList;

    },
    //error call back
    function(){
    });
}

Спасибо

function store($resource) {
    var Resource = $resource('/api/products/');

    Resource.query(function (data) {

        var product = {};
        var productsList = []
        for (i = 0; i < data.length; i++) {

            product = {
                sku: data[i].SKU,
                name: data[i].Name,
                description: data[i].Description,
                price: data[i].Price,
                category: data[i].ProductType
            }
            productsList.push(product);
        }
        $scope.products =  productsList;

    });
}

Когда вы используете this.products = Resource.query(function (data) {...}, this.products получает возвращаемое значение Resource.query(), а не возвращаемое значение функции обратного вызова.

редактировать

использование $scopeне this,

Другие вопросы по тегам