Задать вопрос
@yiicoder

Как лучше организовать динамическое обновление блоков HTML на JS?

Возьмем самый простой пример интернет магазин - на ней есть "виджет" - корзина.

1) При переходе между страницами нужно генерировать актуальную корзину
2) При взаимодействии со страницей - нужно обновлять данные в корзине "динамически"

Задача решается генерированием нужного контента на сервере и обновлением данных на JS.
Что не нравится - при изменении верстки - нужно править на сервере генерацию, править на JS - обновление. Править в двух местах - очень плохо.

Как можно поступить? Можно например использовать angularJS с сервера отдавать только массив данных и обновлять. Минус - честно говоря - ради одной корзины ставить AngularJS - не очень нравится эта идея.

Что можно еще сделать? Например поставить шаблонизатор типа twig - есть и серверная и клиентская версия и скармливать один и тотже шаблон. Опять же усложняется поддерживаемость кода, еще одна технология лишняя.

Какие есть технологии, чтобы с одной стороны - не сильно усложнять поддерживаемость на активно развивающихся проектах, с другой не сильно усложнять "технологии", а соответственно всеравно увеличивать стоимость поддержки проекта?
  • Вопрос задан
  • 3994 просмотра
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 4
mudrick
@mudrick
Máximo progreso hemos alcanzado en minimo seso.
Только лишь для одного виджета корзины Ангулар подключать конечно же не стоит :)

На Ангуларе это делается следующим образом — есть директива корзины (виджет) и есть сервис корзины. Добавление товаров в корзину идет через сервис, а директива слушает изменения сервиса и выводит у себя обновленную инфу.

Вот Директива:
angular.module('app').directive('shoppingCartWidget', function(shoppingCartService) {
    return {
        restrict: 'E',
        replace: true,
        scope: {},
        templateUrl: 'shopping-cart.html',
        link: function(scope, element, attributes) {
            scope.items = [];

            // слушаем изменения в корзине
            scope.$watch(shoppingCartService.getItems, function(items) {
                scope.items = items;
            });
        }
    }
});


Вот сервис:
angular.module('app').directive('shoppingCartService', function(_) {
    var items = [];

    function add(itemData) {
        items.push(itemData);
    }

    function remove(itemID) {
        items = _.reject(items, {id: itemID});
    }

    function clear() {
        items = [];
    }

    function getItems() {
        return items;
    }

    return {
        add: add,
        remove: remove,
        clear: clear,
        getItems: getItems
    }
});


Вот контроллер:
angular.module('app').controller('myController', function(shoppingCartService) {

    // ну, тут будет не массив, а $resource, например

    $scope.items = [
        {
            id: 1,
            name: 'Клавиатура',
            price: 150
        },
        {
            id: 2,
            name: 'Кофе',
            price: 50
        }
    ];

    $scope.addToCart = addToCart;

    function addToCart(itemData) {
        shoppingCartService.add(itemData);
    }

});


Вот вьюха списка товаров:
<ul>
    <li ng-repeat="item in items">
        <span>{{item.name}}</span>
        <button ng-click="addToCart(item)">Добавить в корзину</button>
    </li>
</ul>
Ответ написан
AMar4enko
@AMar4enko
React вам должен быть в самый раз
Ответ написан
Комментировать
mlnkv
@mlnkv
JavaScript Developer
Комментировать
Murmurianez
@Murmurianez
JavaScript Developer
А чем вам обычный jQuery не подходит?

По ajax получаете json и делаете обычный .append()/.html()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы