2014-02-17 3 views
0

Я новичок в AngularJS и я пытаюсь изменить пример на http://www.codeproject.com/Articles/576246/A-Shopping-Cart-Application-Built-with-AngularJS

Я реализовал новую услугу оплаты на примере вызов метода JSon на мой сервер работает нормально, но когда я вызываю метод clearItems(); чтобы удалить предметы из корзины с успехом, он удаляет элементы, как ожидалось, в фоновом режиме (как я вижу, обновляя страницу и корзину) - моя проблема в том, что она не очищает корзину в пользовательском интерфейсе (без обновления)

Если я вызываю this.clearItems(); после вызова Json он очищает элементы корзины в пользовательском интерфейсе, как ожидалось, но это не то, что я требую, поскольку я хочу только очистить элементы после успеха.

Может ли кто-нибудь предложить, как я могу заставить это работать?

Мой Json вызов приведен ниже

var me = this; 
//this.clearCart = clearCart == null || clearCart; 
$.ajax({ 
    cache: false, 
    type: "POST", 
    url: '/pos/JsonCashPayment', 
    contentType: 'application/json', 
    dataType: "json", 
    data: JSON.stringify(this.items), 
    success: function (data) { 
     me.clearItems(); 
     alert('success function called'); 
     // Do something with the returned data 
     // This can be any data 
    } 
}); 

//this.clearItems(); 

Благодарности

Марку

EDIT - Проблемы работы $ HTTP

В дополнение к форме рекомендации Marck Я понимаю, что делать это мне нужно использовать $ http вместо $ json. Проблема с этим заключается в том, что мне нужно сделать это в классе shoppingCart.js (как часть раздела платежей), который подключен к контроллеру через app.js (код ниже). Когда я пытаюсь это, хотя я получаю ошибку JS, что $ http не существует.

Есть ли способ использовать $ http из класса shoppingCart.js?

app.js

var storeApp = angular.module('AngularStore', []). 
config(['$routeProvider', function($routeProvider) { 
$routeProvider. 
    when('/store', { 
     templateUrl: 'POS/store', 
    controller: storeController 
    }). 
    when('/products/:productSku', { 
     templateUrl: 'POS/product', 
    controller: storeController 
    }). 
    when('/cart', { 
     templateUrl: 'POS/shoppingCart', 
    controller: storeController 
    }). 
    otherwise({ 
     redirectTo: '/store' 
    }); 
}]); 

// create a data service that provides a store and a shopping cart that 
// will be shared by all views (instead of creating fresh ones for each view). 
storeApp.factory("DataService", function ($http) { 

// create store 
var myStore = new store($http); 

// create shopping cart 
var myCart = new shoppingCart("AngularStore"); 

controller.js

function storeController($scope, $http, $routeParams, DataService) { 

// get store and cart from service 
$scope.store = DataService.store; 
$scope.cart = DataService.cart; 

shoppingCart.js

function shoppingCart(cartName) { 
this.cartName = cartName; 
this.clearCart = false; 
this.checkoutParameters = {}; 
this.items = []; 

// load items from local storage when initializing 
this.loadItems(); 

// save items to local storage when unloading 
var self = this; 
$(window).unload(function() { 
    if (self.clearCart) { 
     self.clearItems(); 
    } 
    self.saveItems(); 
    self.clearCart = false; 
    }); 
} 

shoppingCart.prototype.checkoutCash = function (parms, clearCart, $scope, $http) { 

// Need to be able to run $http here 
$http({ 
    url: '/pos/JsonCashPayment', 
    method: "POST", 
    data: this.items, 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' } 
}).success(function (data, status, headers, config) { 

}).error(function (data, status, headers, config) { 

}); 

} 
+1

Пожалуйста, используйте угловую структуру $ resource или $ http. Кроме того, вам нужно будет указать Angular на обновление модели, используя метод $ scope. $ Apply(). – Chandermani

+0

Можете ли вы показать мне, как это сделать? Это можно сделать из файла shoppingCart.js, который не является контроллером? Могу ли я получить доступ к $ resource или $ http из этого файла? – user918064

ответ

0

Чтобы сделать свой approac ч работы, вам нужно впрыснуть $ HTTP в контроллер, а затем передать его дальше к функции вы определили в shoppingcart.js, как и в controller.js:

'use strict'; 

// the storeController contains two objects: 
// - store: contains the product list 
// - cart: the shopping cart object 
function storeController($scope, $routeParams, DataService, $http) { 

    // get store and cart from service 
    $scope.store = DataService.store; 
    $scope.cart = DataService.cart; 

    // use routing to pick the selected product 
    if ($routeParams.productSku != null) { 
     $scope.product = $scope.store.getProduct($routeParams.productSku); 
    } 

    $scope.cart.checkoutCash('parms', 'clearCart', $scope, $http); 

} 

Очевидно, что первые два аргумента I отправленные на checkoutCash являются наполнителем и должны быть заменены более подходящими значениями.

+0

Спасибо за помощь, моя проблема в том, что у контроллера есть два модуля shoppingCart.js и store.js, на которые ссылаются контроллеры (вы можете увидеть это в примере проекта со ссылкой в ​​вопросе), и если я попытаюсь используйте $ http или $ resource. Я получаю неопределенную ошибку JS. Есть ли способ запустить $ http или $ ресурс из этих файлов подсетей? – user918064

+0

Вы вводите $ http или $ ресурс (в зависимости от того, что вы решили использовать) в контроллер, в который вы вставили свой код? Вам нужно сделать это из своего модуля приложения AngularJS, и вы можете делать это только из внешних файлов .js, если Angular был загружен, и вы добавляете другой компонент (например, контроллер, службу или директиву) к запущенному модулю , –

+0

Привет Я впрыскиваю $ http в контроллер, проблема выглядит как shoppingcart.js - это отдельный класс js, который добавлен в DataService в примере. Введенный $ http, похоже, не распознается на этом уровне. Есть ли способ использовать $ http на уровне файла js? – user918064

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