AngularJS 实践:应用开发 :: ENA13 价格条码-(五)

简介:

上节我们完成了基本用户交互工作,这一个我们将要完成用户表单输入,和数据列表等。相关联 AngularJS 的核心知识包括:Scopes 对象(What are Scopes),Data BindingController以及 UI Router State Manager等。
上节回顾 AngularJS 实践:应用开发 :: ENA13 价格条码-(四)

本节代码获取

如果已经 Clone 了代码库,你只需要执行 git checkout codetrip-2

$ git clone https://code.aliyun.com/passpile/pricebarcode.git
$ git checkout codetrip-2

控制器 FrontCtrl

在这个控制器我们要完成这几个任务:

  1. 收集用户的输入信息:前缀码,品类编号(分类编号)和名称,,价格。
  2. 根据用户的输入信息生成相应的 EAN13 条形码的十进制数字序列。(二进制的转换以及图形生成,我们将借助于 AngularJS 的插件 angluar-barcode完成。这个插件在前面我们已经包含了。"angular-barcode": "^0.0.4")
  3. 将用户输入的信息相应的EAN13 条形码的十进制数字序列放入列表中,用户可以添加或移除列表中的条目
  4. 提供[预览]操作,让用户预览上述列表中的条目所对应的条形码。

scripts/route.js

...
.controller('FrontCtrl',function($state,$scope,ean13gen){
    $scope.frontHeading = 'ENA13 价格条码生成器说明';
    $scope.priceCodeItems = [];
    $scope.prefix = '26';
    //1. 收集用户的输入信息:前缀码,品类编号(分类编号)和名称,,价格。
    $scope.genCode = function(prefix,kindCode,kindName,price){
        var item = {prefix:prefix,kindCode:kindCode,kindName:kindName,price:price};
        //2. 生成相应的 EAN13 条形码的十进制数字序列
        item.priceCode = ean13gen(item);
        //3. EAN13 条形码的十进制数字序列放入列表中
        $scope.priceCodeItems.push(item);
    };
    $scope.remove=function(idx){
        //3. 用户可以除列表中的条目
        $scope.priceCodeItems=_.remove($scope.priceCodeItems,function(n){
                return n === idx;
             });
    };
    //4. 提供[预览]操作,让用户预览上述列表中的条目所对应的条形码
    $scope.preview=function(){
        // go preview
    };
})
...

借助 Scopes 对象,为视图 front.html 提供数据和操作绑定。例如:ng-model="kindCode", ng-click="genCode(prefix,kindCode,kindName,price)" 等( Directives )。

ean13gen 为生成 EAN13 条形码的十进制数字序列的功能模块。是一个自定义的Factory Recipe 并通过 DI 完成模块服务或功能连接组合。
scripts/route.js

...
.factory('ean13gen',function(){
    function checksum(number){
        var result = 0;
        for(var i=0;i<12;i+=2){result+=parseInt(number[i]);}
        for(var i=1;i<12;i+=2){result+=parseInt(number[i])*3;}
        return (10 - (result % 10)) % 10;
    }
    return function(options){
        var pricetmpl = ['0','0','0','0','0','0'];
        var _strp = options.price+'';
        _strp=_strp.replace('.','');
        var diff = 6-_strp.length;
        for(var i=0;i<_strp.length;i++,diff++){
            pricetmpl[diff]=_strp[i];
        }
        var strCode= options.prefix+options.kindCode+pricetmpl.join('');
        return strCode+checksum(strCode);
    };
})
...

一般来说这些服务模块应单独写入一个服务模块文件,当前暂且编入同一个文件,便于阅读

检视用户表单输入及页面效果

如果没有启动 browser sync 请用下列命令进行启动

$ cd ~/webshop/pricebarcode
$ gulp serve

pricecode_illustration_10

如果出现问题,请通过 Chrome Developer Tools 进行排查

本节总结

  1. 我们基本完成了这个小应用的主要功能。下一节只要借助angular-barcode插件完成预览,并制作一个简单的打印就可以完工了。
  2. 这里未涉及 AngularJS 的单元测试。有兴趣的同学请自行参考Unit Testing
  3. AngularJS 与 Gulp 是否适用于你的项目,请多斟酌。很多概念和模式对于有经验的开发者来说已经是很熟悉的了。至于使用 AngularJS 进行开发不过是一种新的体验罢了。
  4. 就在编写这个系列博文的时候 AngularJS 2.0 已经进入 beta 版了。有兴趣的同学可以尝尝鲜。:)

待续...

目录
相关文章
|
前端开发 JavaScript .NET
AngularJS 实践:应用开发 :: ENA13 价格条码-(三)
上一节我们完成了开发工作流工具和环境准备,这一节我们将进行渐进式应用编程。熟悉 AngularJS 开发的同学请跳过。 上一节参考: AngularJS 实践:应用开发 :: ENA13 价格条码-(二) 添加 web 应用所依赖的 JavaScript, Stylesheet 引用 编辑 i
2412 0
|
6月前
|
JavaScript
基于Angular的简易在线购物车设计与实现
基于Angular的简易在线购物车设计与实现
70 3
|
3月前
|
前端开发 UED 开发者
深度剖析Angular表单控件:从模板驱动到响应式表单的最佳实践,带你全面掌握Angular表单处理机制,提升前端开发效率与用户体验的终极指南
【8月更文挑战第31天】本文通过代码示例详细介绍了 Angular 中两种主要的表单处理方式:模板驱动表单和响应式表单。模板驱动表单适用于简单场景,可在 HTML 模板中直接定义表单控件并实现数据绑定和验证。响应式表单基于 RxJS,提供更灵活的表单管理和复杂的逻辑处理。通过具体示例展示了每种方式的最佳实践,帮助开发者简化表单处理,提高开发效率和用户体验。
30 0
|
3月前
|
JavaScript 应用服务中间件 nginx
玩转现代化部署:Angular与Docker的完美邂逅——细说如何通过容器化技术让您的Angular应用飞速上线,实现一键部署的高效与便捷,彻底告别复杂流程
【8月更文挑战第31天】容器化技术已成现代软件部署标配,为应用提供一致的运行环境。本文通过具体示例详细介绍了如何使用 Docker 容器化 Angular 应用,包括创建 Angular 项目、编写 Dockerfile 以及构建和运行 Docker 镜像的过程,显著提升了部署效率与可靠性。无论在本地调试还是生产部署,Docker 均提供了高效解决方案。
45 0
|
设计模式 JavaScript 前端开发
12分布式电商项目 - AngularJS快速入门
12分布式电商项目 - AngularJS快速入门
31 0
|
设计模式 前端开发 JavaScript
11分布式电商项目 - AngularJS简介
11分布式电商项目 - AngularJS简介
49 0
|
开发工具 git
angularjs增删改查(2)--品牌管理
angularjs增删改查(2)--品牌管理
179 0
angularjs增删改查(2)--品牌管理
|
API
Angular 2.x折腾记 :(7) 初步了解表单:模板驱动及数据驱动及脱坑要点
表单在整个系统中的作用相当重要,这里主要扯下响应表单的实现方式。 首先需要操作表单的模块引入这两个模块; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
169 0