Angular directive实践($compile , ngModel ...)

.directive('ngCalculator', function($compile, $timeout){
  return {
    restrict: 'EA',
    require: 'ngModel',
    scope: {
      devices: '=',
      key: '=',
      displayName: '=',
      bindAttr: '='
    },
    link: function(scope, element, attrs, ngModel) {
      scope.results = {};
      var text = attrs.ngCalculator;
      var replacements = text.match(/\[[a-zA-Z0-9]+\]/g);
      var formula = text.match(/\<\-(.+)\-\>/);
      text = text.replace(formula[0], '');
      for(var i = 0; i < replacements.length; i++) {
        var id = replacements[i].replace('[','').replace(']','');
        text = text.replace(replacements[i], '<input type="text" ng-model="results.'+id+'" style="width: 80px;margin: auto 10px;"/>');
      }
      text = '<div>'+text+'</div>';
      element.replaceWith($compile(text)(scope));
      scope.$watchCollection('results', function() {
        var input_check = true;
        angular.forEach(replacements, function(replacement) {
          var id = replacement.replace('[','').replace(']','');
          var modelValue = parseInt(scope.results[id]);
          if(!modelValue) {
            input_check = false;
          }
        });
        if(input_check == true){
          var formula_instance = formula[1];
          angular.forEach(replacements, function(replacement) {
            var id = replacement.replace('[','').replace(']','');
            var regex = new RegExp(id, "g");
            formula_instance = formula_instance.replace(regex, scope.results[id]);
          });
          ngModel.$setViewValue(scope.$eval(formula_instance));
          ngModel.$render();
        }
      });
    }
  }
})

这是一个自定义计算器的指令,用来解析一串字符,效果图如下:

115808_09L0_248437.png

能处理穿插在自然语言里计算公式.

使用方法:

<div ng-calculator="{{ sample }}" ng-model="result"></div>
<script>
app.controller( ... , ['$scope',...,function($scope,...){
    $scope.sample = "我有[a]存款,我想拿出[b]%,作为我的结婚费用。
                            目前我每个月收入[c],我想拿出[d]%,作为我的婚礼费用。(完善你的婚期,我们将更精确的帮您做预算)。
                            男方父母会给我们[e]元,女方父母会给我们[f]元。
                            我们预计会有额外的[g]元,可以用于婚礼。
                            <-a*b*0.01+c*d*0.01*12+e+f+g->                      ";
    $scope.$watch('result', function(new,old){
       console.log(result);
    });
}]);
</script>

其实sample字符串是生成表单的,[n]这个是变量替换,将变量替换成 input[type="text"],

<-a*b*0.01+c*d*0.01*12+e+f+g->

这是变量拼凑起来的计算公式,

ngModel的result返回计算结果。

转载于:https://my.oschina.net/imot/blog/497244

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值