【发布时间】:2016-01-23 12:10:43
【问题描述】:
我有一个 JSON 数据集,其中每一行都包含一个输入值、一小块用于计算的 JavaScript 代码和一个小计值,该小计值是 eval() 执行计算后输入值的结果。数据集将包含一行或多行。每个输入都将以 HTML 格式重复到页面上,并且小计的总和将作为总值以及每个单独的小计值显示给用户。
我尝试使用 $watch 并为转发器中的每一行添加一个,但当用户更改输入值时,我似乎无法让它们触发。
我创建了我的第一个Sample_Plunker 来展示我想要实现的目标,但没有成功。
不确定我是否也应该在此处发布代码,但我们将不胜感激。
基本上是我的 HTML:
<div ng-controller="MainCtrl as MainCtrl" ng-init="MainCtrl.init()">
<div ng-repeat="rule in MainCtrl.myCode">
Input_{{$index}}: <input ng-model="rule.inpValue" type="number" />
<!-- the following needs to reflect the result after eval() of myCode[?].code from JSON below -->
Subtotal: {{rule.nSubTotal}}
<br />
</div>
<br />
<!-- the following should be a sum of all values above -->
Total: {{MainCtrl.nTotal}}
</div>
这是我的示例数据和没有响应的 $watch:
app.controller('MainCtrl', function($scope) {
var _this = this;
_this.nTotal = 0;
// sample js code tht will be execuited later
_this.myCode = [{
"code": "_this.myCode.inpValue +2",
"inpValue": 0,
"nSubTotal": 0
}, {
"code": "_this.myCode.inpValue*3",
"inpValue": 0,
"nSubTotal": 0
}, {
"code": "_this.myCode.inpValue/5",
"inpValue": 0,
"nSubTotal": 0
}];
this.init = function() {
$scope.$watch('MainCtrl.myCode[i].inpValue', function() {
// debugger;
// assuming if watch would fire, subtotal = eval( input )
_this.nSubTotal = eval(_this.myCode[i].code);
// I would also keep a running total at this point
_this.nTotal = _this.nTotal + _this.myCode[i].nSubTotal;
});
}; //end init()
});
【问题讨论】:
-
您的手表没有触发,因为
$scope上没有属性i正在评估手表表达式。你能解释更多关于数据集的信息吗?为什么需要那些 JS 代码 sn-ps?据我所知,它们甚至无效。_this.myCode.inpValue将解析为 undefined,因为_this.myCode是一个数组。 -
没有通配符
[i]可以让您的手表正常工作。此外,您在手表内部的逻辑也不会正确跟踪总数。像这样使用eval看起来真的很危险,而且真的没有多大意义。有更简洁的方法可以使用 2 个属性而不是eval来进行修饰符 -
Igor:代码 sn-ps 是购物车系统的一部分,但与我以前见过的任何东西都不一样。有些房东是一个相当固定的群体,大约 800 人(将这些视为公司)。每个主机都有 1 个或多个适用于其客户的结帐规则。每台主机大约有 150 个客户。主机可以创建规则(代码 sn-ps)并将它们分配给他们的每个客户。所以要将所有这些规则硬编码到源代码中,我认为从数据中获取规则是处理这种大小的矩阵的更好方法。为了维护它,我只需要修改数据。