65.9K
CodeProject 正在变化。 阅读更多。
Home

Angular 购物车编辑器

2016年3月1日

CPOL

5分钟阅读

viewsIcon

21954

downloadIcon

2016

Angular 编辑器,用于我在 CodeProject 上发布的 Angular 购物车。

点击此处查看此 AngularJS 购物车的可用演示

引言

这是我为 CodeProject 上发布的 Angular 购物车 创建的 Angular 购物车编辑器。

您始终可以在我的网站上找到我的 Angular 购物车和编辑器的最新版本,网址为:
www.Software-rus.com.

我想在 Angular 中为我的购物车创建一个**简单**的编辑器,允许用户对 JSON 文件、本地或远程数据库执行 CRUD 操作。我的第一个想法是使用 `datagrid` 来显示产品,用户可以通过选择 `datagrid` 中的一行来编辑产品,但很快就发现 `datagrid` 会占用屏幕太多空间,因此我决定采用不同的 GUI 布局,将用于选择要编辑的产品组件放在屏幕左侧的侧边栏中,使用简单的列表,将较大的屏幕区域留给布局每个产品的属性,如下图所示。我比 `datagrid` 更喜欢这种布局和方法来编辑。这种布局和方法可以应用于编辑任何 JSON 文件或数据库。每个记录的字段显示在名为 _editor-details.htm_ 的主视图中。当您在侧边栏中选择一个项目时,主视图会更新以显示选定项目的该记录。

数据源

用户可以轻松修改此编辑器如何从不同数据源加载和保存数据。我使用的方法是允许用户在配置文件中设置默认数据源,然后从下图所示的下拉菜单中选择要加载数据的数据源。

我使用了一个使用 **promise** 和 **deferred** 异步加载数据的 `DataService`。Angular 中的 promise 充当占位符,JavaScript 对象以异步方式返回某些结果作为数据,并且不保证固定的响应时间。此 deferred 对象使用 `$q.defer()` 构建,用于通知异步工作的成功或不成功完成。在 deferred 对象中完成任务后,我们可以访问 promise 对象中的结果。以这种方式加载数据的 Angular 代码非常直接,如下所示。

// I created a data service that provides the 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, $q, CONFIG) { 

// Can be loadded from a JSON file, a local .mdf database, or a remote database 
//'CF_DATA_FILE': 'ac_products/products.js', 
//'CF_DATA_LOCAL': '/crud.ashx?ac=getproducts&cn=local', 
//'CF_DATA_REMOTE': '/crud.ashx?ac=getproducts&cn=remote',

var dataIndex = localStorage["data_src_index"]; 
if (dataIndex == null || dataIndex == "undefined") { 
    dataIndex = 0; localStorage["data_src_index"] = 0; 
} 
var dataSource = CONFIG.CF_DATA_FILE; 
if (dataIndex == 0) { 
    // We randomize the string to prevent caching
    dataSource = "/" + CONFIG.CF_DATA_FILE + "?rnd=" + new Date().getTime(); 
} 
else if (dataIndex == 1) { 
    dataSource = CONFIG.CF_DATA_LOCAL; 
} 
else if (dataIndex == 2) { 
    dataSource = CONFIG.CF_DATA_REMOTE; 
} 
function Store() { 
    var productsDeferred = $q.defer(); 
    this.products = productsDeferred.promise; //this.products is a promise 
    $http.get(dataSource).success(function (data, status, headers, config) { 
    var products = []; 
    for (var i = 0, len = data.length; i < len; i++) { 
        var prod = data[i]; 
        if (prod.storeid == "7cc6cb94-0938-4675-b84e-6b97ada53978") { 
            var _expecteddate = new Date(prod.expecteddate); 
            prod.expecteddate = _expecteddate; products.push(prod); 
        } 
    } 
    productsDeferred.resolve(products); 
}).error(function (data, status, headers, config) { 
    alert("Please check you have updated ConnectionString with YOUR OWN information!"); 
    // Please update "remoteCartConnectionString" with your own data !!! 
});
...etc.

请注意,我决定从 JSON 文件中将 `Date` 字段加载为“`Date`”对象,如下所示。

    var _expecteddate = new Date(prod.expecteddate);
    prod.expecteddate = _expecteddate;

Bootstrap 3 菜单和导航栏

此编辑器中使用的 Bootstrap 3 菜单已在我上面引用的购物车文章中进行了详细讨论,因此我在此不再重复所有代码的讨论。您可以升级到更高版本的 Bootstrap 来使用导航栏,并且在高于 Bootstrap 3 的版本中,导航栏代码中用于下拉菜单的必要更改(**不使用 ui-bootstrap**)如下所示。

<li class="dropdown" ng-class="{open1: open1}">
    <a ng-click="navCollapsed = !navCollapsed" href="" class="dropdown-toggle" 
    data-toggle="dropdown" role="button" aria-expanded="false">
    <span class="fa fa-cart-plus"></span>&nbsp;Shopping Carts
    <span class="caret"></span></a>
    <ul role="menu" class="dropdown-menu">
        <li><a ng-click="open1=!open1" ng-href="some url" target="_blank">
            <img src="admin_img/codeproject.png" description="''" />
            &nbsp;Shopping Cart Article & Source Code</a></li>
    </ul>
</li>

HTML 字段

购物车中的几个字段,即 `shortdesc`、`description`、`carousel_caption` 和 `productname`,可以有 HTML 格式,因此我决定为这些字段添加一个非常简单的编辑器,名为 `nng-wig`。您可以在 http://ngmodules.org/modules/ngWig 获取此模块。

这些字段不应包含任何段落标签或可能破坏购物车外观的复杂 HTML,这一点很重要。因此,我将编辑限制为粗体、斜体和 `<br />` 用于换行。我查看了许多用于编辑 HTML 内容的模块,但其他编辑器插入了太多不必要的 HTML 格式,从而破坏了购物车中的显示。

嵌入式视频管

我一直认为,一图胜千言,而视频胜百万言。因此,在我的 Angular 购物车中,我添加了为商店中的商品插入图片或视频的功能。值得注意的是,如今有许多视频管服务,从 Vimeo 到中国巨大的 _**YouKu Tube 服务器**_,后者现在是世界上最大的电视网络。

sstoreApp.directive('embedVideo', function ($sce) { 
    return {
    restrict: 'EA', 
    scope: { tube: '=', code: '=' },
    replace: true,
    template: '<div class="video"><iframe src="{{url}}" frameborder="0" 
              webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div>
    link: function (scope) {
    scope.url = "about:blank";
    scope.$watch('code', function (videoidVal) {
    if (videoidVal) {
        if (scope.tube === 'youtube') {
            scope.url = $sce.trustAsResourceUrl("http://www.youtube.com/embed/" + videoidVal);
        } else if (scope.tube === 'youku') {
            scope.url = $sce.trustAsResourceUrl("http://player.youku.com/embed/" + videoidVal);
        } else if ..... etc. // other tubes
        }
        scope.$apply();
    } }); } }; });

在某些情况下,视频管服务会提供一种方法来提取视频屏幕的图像,例如 YouTube 视频。我在屏幕左侧添加了一个链接,当选择了 YouTube 视频管时,它会显示 YouTube 视频屏幕图像的链接,如下所示。

<a ng-show="product.showvideo && product.tube == 'youtube'" target="_self"
   href="https://img.youtube.com/vi/{{product.videoid}}/hqdefault.jpg"
   download="">YouTube Image</a> 

文件上传

用户可以在编辑器中将图像上传到服务器。我将所有上传的图像放在 `ac_products` 目录中,但用户可以在此文件夹中创建子目录来帮助组织图像。通过在“**img Dir**”按钮右侧的字段中输入所需子目录的名称,然后按下该按钮设置路径以包含他们输入的子目录。例如,我是旧漫画书的收藏家,我创建了一个名为“comics”的子目录来存放我的漫画图像。此功能的 Angular 代码如下所示。

$scope.uploadFile = function (event) 
{
    var fd = new FormData();
    for (var i in $scope.files) { 
        fd.append("uploadedFile", $scope.files[i]); 
    } 
    var imgDir = localStorage["img_dir"]; 
    var uploadUrl = "ImageHandler.ashx?dir=" + imgDir; 
    $.ajax({ url: uploadUrl, dataType: 'text', cache: false, 
        contentType: false, 
        processData: false, 
        data: fd, 
        type: 'post', 
        success: uploadComplete 
    }).error(function () { alert("failed!") }); 
}

结论

此编辑器中大部分代码的解释都在我关于 Angular 购物车的文章中进行了说明,因此我在此不再重复。但我认为此编辑器应单独发布一篇文章,以便于理解。我还更新了我发表在 CodeProject 上的关于 Angular 购物车的文章 Angular Shopping Cart That is Responsive Mobile 中的许多功能。

您可以通过直接插入我的 Angular Carousel 的代码,轻松添加我的 **AngularJS Super Slick Carousel**。要添加轮播图,请访问:
https://codeproject.org.cn/Articles/895739/Super-Slick-Carousel-Using-AngularJS-Directive

在接下来的几周内,我将更新此编辑器和我的 Angular 购物车,并将发布一个 Angular 2 版本,包含我的购物车和此编辑器,并增加许多新功能。

© . All rights reserved.