这个页面让我真正理解了前端如何在页面显示数据。后台传过来的数据需要我做结构上的修改之后再传给后台,当时写了数组和循环,后来发现了更加简单的方式。模型对象始终使用一个,操作页面数据的模型和后台的模型合用一个。业务逻辑不能局部完成,要有整体的概念。这个页面处理数据的时候老大还花时间给我讲解了一番,真的十分感谢他。(虽然吓得我连午饭都没有吃)
管理代码是个很好得习惯,时不时回头整理一遍就像抚摸自己的孩子一样,这就是我制造的东西啊!心里有这样的感叹,吧{}放在该放的位置,就像把孩子凌乱的头发拨正。(虽然我没有孩子)很可惜,现在这个公司并不强调格式。因为是创业公司,人还很少。是风险比较低的创业公司。我喜欢这家公司,喜欢这里的人,但是我要离开了。
1、说说这个页面最重要的数据处理,这让我第一次见识到了什么叫做优美的代码。(这个是相对的,这里的优美是指相对于我之前遍布整个控制器的循环,实在是让人眼花缭乱,工作效率极低)
//这是后台传过来的模型
$scope.TableDetail = [];//用于循环的数组
$scope.InStockEntity = {
"WareHouseID": 0,
"ProviderID": 0,
"proNum": 0,
"Remark": null,
"inStockDetails": [
{
"ProductID": 0,
"isNum": 0,
"pNum": 0,
"IndexID":0
}
]
};
//这是用于传回后台的模型
var data = {
'inStockDetails': [],
'proNum': $scope.num,
'WareHouseID': $scope.Ware,
'ProviderID': $scope.supper,
"Remark": $scope.InStockEntity.Remark,
}
for (var i = 0; i < $scope.TableDetail.length; i++) {
if (!$scope.TableDetail[i].is_delete) {
data['inStockDetails'].push({
'productID': $scope.TableDetail[i]['IndexID'],
'isNum': $scope.TableDetail[i].pNum,
'pNum': $scope.TableDetail[i].pNum,
})
}
console.log(data);
}
2、修改的绑值
<span class="m" ng-model="detailModel.pSKU"> 商品代码:{{detailModel.pSKU}}span>
和Ext真的原理相同啊!Ext中使用单花括号绑值的。如果需要编辑,就会定义一个viewmodel,然后引入到view中。这里就是有一个模型啊,模型掌管着变化啊!
3、开始建立起使用angular写事件的思想
<table class="table w-full no-padder m-t-n-lg active success table-hover ">
<thead>
<tr>
<th width="8%" class="text-center ">
<label class="i-checks m-b-none " style="margin-left:-3px"><input type="checkbox" id="all" name="check" class="group-checkable"><i>i>label>th>
<th width="32%" class="">商品代码th>
<th width="32%">商品名称th>
<th width="32%">数量th>
tr>
thead>
<tbody>
<tr id="rows" ng-repeat="table in InStockEntity.inStockDetails" ng-if='!table.is_delete'>
<td class="text-center ">
<label class="i-checks m-b-none " style="margin-left:-3px"><input type="checkbox" class="group-checkable" ng-click="table.is_selected=table.is_seleted?false:true"><i>i>label>
td>
<td>
<span class="protable" type="text">{{table.pSKU}}span>
td>
<td> {{table.pName}}td>
<td>
<span type="text" >{{table.pNum}}span>
td>
tr>
tbody>
<tfoot>
<tr>
<td> <span>总计:span>td>
<td>
<span type="text" >{{calculate_total()}}span>
td>
tr>
tfoot>
table>
控制器,首先看总计。看看在控制器里面是这样写方法的。angular.forEach()遍历函数。ng-if真的很奥妙!
//计算数据(ng)
$scope.calculate_total = function () {
var num = 0;
angular.forEach($scope.InStockEntity.inStockDetails, function (table) {
if (!table.is_delete) {
num = num + table.pNum;
}
})
$scope.num = num;
return num;
}
angular.forEach()遍历函数
var objs =[{a:1},{a:2}];
angular.forEach(objs, function(data,index,array){
//data等价于array[index]
console.log(data.a+'='+array[index].a);
});
objs:需要遍历的集合
data:遍历时当前的数据
index:遍历时当前索引
array:需要遍历的集合,每次遍历时都会把objs原样的传一次。
ng-if='!table.is_delete'
ng-if会移除dom,生成dom,而ng-show只是改变其display属性。
当时真的狠狠苦恼了一番的效果:
ng-click="table.is_selected=table.is_seleted?false:true"
$scope.deleteFunc = function () {
if (!$scope.popvop) {
popExecFunc = function () {
for (var i = 0; i < $scope.InStockEntity.inStockDetails.length; i++) {
var table = $scope.InStockEntity.inStockDetails[i]
if (table.is_selected) {
table.is_delete = true;
} else if(!table.is_selected){
var inforData = { code: "400", data: "没有删除选项~(๑• ₃ •๑)" }
$scope.toaster(inforData, "warning")
}
}
};
popCancelFunc = function () {
}
}
};
给ng-repeat生成的表格做删除。
table.is_delete
关于这个属性,为什么是is_delete,而不是delete,或者deleted。现在总结的时候有点搞忘了,要么是根据table数据里后台返回值属性设置的,要么就是经验判断。这个当时也是一个难点的。
4、添加页面考虑到了用户说不定想要持续性添加,就是说如果在点击确定保存按钮后,刷新页面而不是跳转到详情页。
if (!$scope.popvop) {
popExecFunc = function () {
$state.go("app.instock_add", {}, { reload: true });
};
popCancelFunc = function () {
$state.go('app.instock')
}
}
5、扫条码
相同的数据加,总数加1。这个也是老大指导我的。曾经查找这个方法的时候,观摩了老大怎么弄得。首先他听我说着想要实现的效果,马上脑子里面就有一个概念“我好像在哪里看到过,我知道这个想法”(积累深厚),他也是从知道这个函数的用法到能够使用他,整个过程非常迅速。看到他解决问题的效率和速度让我意识到了我跟他的差距真的不是一星半点。
//测试按钮函数
$scope.pbar = function () {
///检测数组有没有这个对象
var querResult = $linq($scope.InStockEntity.inStockDetails)
.where(function (x) { return x.pBarCode == $scope.pbarcode; }).toArray();
if (querResult.length != 0) {
querResult[0].pNum++;
} else {
//不存在,通过条码获得商品数据
var RtnData = Get.get(app_settings.api_host_url + '/api/product/SingleProductPull', { ids: $scope.pbarcode });
RtnData.then(function (resultMessage) {
resultMessage.Data.pNum = 1;
$scope.detailModel = resultMessage.Data;
console.log($scope.detailModel);
//长宽高
$scope.long = $scope.detailModel.pWHL.split("*")[0];
$scope.width = $scope.detailModel.pWHL.split("*")[1];
$scope.height = $scope.detailModel.pWHL.split("*")[2];
$scope.TableDetail.push($scope.detailModel);
$scope.InStockEntity.inStockDetails = $scope.TableDetail;
});
}
}