অ্যাঙ্গুলারজেএস এনজি-রিপিটে পুনরাবৃত্ত উপাদানের সমষ্টি গণনা করা হচ্ছে


107

নীচের স্ক্রিপ্টটি ব্যবহার করে একটি শপ কার্ট প্রদর্শন করে ng-repeat। অ্যারের প্রতিটি উপাদানগুলির জন্য, এটি আইটেমের নাম, তার পরিমাণ এবং উপফলক ( product.price * product.quantity) দেখায় ।

পুনরাবৃত্ত উপাদানগুলির মোট মূল্য গণনা করার সহজ উপায় কী?

<table>

    <tr>
        <th>Product</th>
        <th>Quantity</th>
        <th>Price</th>
    </tr>

    <tr ng-repeat="product in cart.products">
        <td>{{product.name}}</td>
        <td>{{product.quantity}}</td>
        <td>{{product.price * product.quantity}} €</td>
    </tr>

    <tr>
        <td></td>
        <td>Total :</td>
        <td></td> <!-- Here is the total value of my cart -->
    </tr>

</table>

1
কৌণিক.আর.এচ ($ স্কোপ.কার্ট.প্রডুক্টস, ফাংশন (ফিল্টারওবিজে, ফিল্টারকি) $। স্কোপ.টোটাল + = ফিল্টারওবিজ.প্রডাক্ট.প্রাইস * ফিল্টারওবিজ.প্রডक्ट.উয়েনটিটি;});
গ্যারি



আপনি টিফুট-ট্যাগ ব্যবহার করবেন না কেন?
পাস্কল

উত্তর:


147

টেমপ্লেটে

<td>Total: {{ getTotal() }}</td>

নিয়ামক মধ্যে

$scope.getTotal = function(){
    var total = 0;
    for(var i = 0; i < $scope.cart.products.length; i++){
        var product = $scope.cart.products[i];
        total += (product.price * product.quantity);
    }
    return total;
}

24
এর একটি খারাপ দিক এটি সংগ্রহের উপরে দুবার পুনরাবৃত্তি করে। এটি ছোট সংগ্রহের জন্য সূক্ষ্ম, তবে যদি সংগ্রহটি বড় হয় তবে কী হবে? এনজি-রিপিটের মতো মনে হচ্ছে কোনও প্রদত্ত বস্তুর ক্ষেত্রে চলমান যোগফলের একটি উপায় থাকা উচিত।
icfantv

2
@Pascamel আমার উত্তর (চেক stackoverflow.com/questions/22731145/... ) আমি মনে করি যে আপনি ফিল্টার সম্পর্কে কি জিজ্ঞাসা করার জন্য কাজ
Rajamohan Anguchamy

এই প্রশ্নটিতে অবতরণ করার সময় আমি ঠিক কী খুঁজছিলাম, @ রাজাশিলপা শীর্ষে আসার জন্য ধন্যবাদ!
পাসকামেল

2
এই সমাধানটির মূল সমস্যাটি হ'ল মোট প্রতিটি ডাইজেস্টের সাথে মোট গণনা করা হবে, কারণ এটি একটি ফাংশন কল।
মার্ক ডুরডিন

@ আইফ্যাফ্যান্টভিউ কীভাবে সংগ্রহের দ্বিগুণ ঘটছে?
ক্রিশ্চিয়ান রামিরেজ

58

এটি ফিল্টার এবং সাধারণ তালিকা উভয়ই কাজ করে। তালিকা থেকে সমস্ত মানের যোগফলের জন্য একটি নতুন ফিল্টার তৈরি করার প্রথম জিনিস এবং মোট পরিমাণের যোগফলের জন্য সমাধানও দেওয়া হয়েছে। বিশদ কোডে এটি ফিজার লিঙ্কটি পরীক্ষা করুন

angular.module("sampleApp", [])
        .filter('sumOfValue', function () {
        return function (data, key) {        
            if (angular.isUndefined(data) || angular.isUndefined(key))
                return 0;        
            var sum = 0;        
            angular.forEach(data,function(value){
                sum = sum + parseInt(value[key], 10);
            });        
            return sum;
        }
    }).filter('totalSumPriceQty', function () {
        return function (data, key1, key2) {        
            if (angular.isUndefined(data) || angular.isUndefined(key1)  || angular.isUndefined(key2)) 
                return 0;        
            var sum = 0;
            angular.forEach(data,function(value){
                sum = sum + (parseInt(value[key1], 10) * parseInt(value[key2], 10));
            });
            return sum;
        }
    }).controller("sampleController", function ($scope) {
        $scope.items = [
          {"id": 1,"details": "test11","quantity": 2,"price": 100}, 
          {"id": 2,"details": "test12","quantity": 5,"price": 120}, 
          {"id": 3,"details": "test3","quantity": 6,"price": 170}, 
          {"id": 4,"details": "test4","quantity": 8,"price": 70}
        ];
    });


<div ng-app="sampleApp">
  <div ng-controller="sampleController">
    <div class="col-md-12 col-lg-12 col-sm-12 col-xsml-12">
      <label>Search</label>
      <input type="text" class="form-control" ng-model="searchFilter" />
    </div>
    <div class="col-md-12 col-lg-12 col-sm-12 col-xsml-12">
      <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2">
        <h4>Id</h4>

      </div>
      <div class="col-md-4 col-lg-4 col-sm-4 col-xsml-4">
        <h4>Details</h4>

      </div>
      <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2 text-right">
        <h4>Quantity</h4>

      </div>
      <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2 text-right">
        <h4>Price</h4>

      </div>
      <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2 text-right">
        <h4>Total</h4>

      </div>
      <div ng-repeat="item in resultValue=(items | filter:{'details':searchFilter})">
        <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2">{{item.id}}</div>
        <div class="col-md-4 col-lg-4 col-sm-4 col-xsml-4">{{item.details}}</div>
        <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2 text-right">{{item.quantity}}</div>
        <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2 text-right">{{item.price}}</div>
        <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2 text-right">{{item.quantity * item.price}}</div>
      </div>
      <div colspan='3' class="col-md-8 col-lg-8 col-sm-8 col-xsml-8 text-right">
        <h4>{{resultValue | sumOfValue:'quantity'}}</h4>

      </div>
      <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2 text-right">
        <h4>{{resultValue | sumOfValue:'price'}}</h4>

      </div>
      <div class="col-md-2 col-lg-2 col-sm-2 col-xsml-2 text-right">
        <h4>{{resultValue | totalSumPriceQty:'quantity':'price'}}</h4>

      </div>
    </div>
  </div>
</div>

এই ফিডল লিঙ্কটি পরীক্ষা করুন


আরে আমি 'undefined'ব্যবহার করার সময় পেয়ে যাচ্ছি resultValue, তবে আমি যদি itemsএটি ব্যবহার করি তবে ভাল ধারণা, কোনও ধারণা .. ??
সালাল আসলাম

প্রথমে আপনি নীচের কোডটি "রেজাল্টভ্যালু = (আইটেম | ফিল্টার: {'বিশদ': অনুসন্ধানফিল্টার})" পরীক্ষা করে দেখুন, কারণ সমস্ত ফিল্টার মান সেই পরিবর্তনশীল "রেজাল্টভ্যালু" এ সঞ্চয় করে। আমি মনে করি আপনি {} বা () এর জন্য ভুল করেছেন, আবার একবার যাচাই করুন।
রাজমোহন আঙ্গুচামি

আমি যদি itemsএটি ব্যবহার করি তবে ফিল্টারগুলির সাথে কাজ করবে না, সাহায্য করুন!
সালাল আসলাম 15'15

আমার কোডটি এর মতো ng-repeat="campaign in filteredCampaigns=(campaigns | filter:{'name':q})"এবং{{ filteredCampaigns | campaignTotal: 'totalCommission' | number: 2 }}
সালাল আসলাম 15'15

হ্যাঁ, কারণ আইটেমগুলি এখনও ফিল্টার করা হয়নি, ফিল্টারটি হওয়ার পরে ফলাফলটি অন্য কোনও মডেলের কাছে সংরক্ষণ করা উচিত এবং কেবল সেই মডেলটিই ব্যবহার করা উচিত। আমার নমুনায় আমি "রেজাল্ট ভ্যালু" মডেলটি ব্যবহার করেছি।
রাজমোহন আঙ্গুচামি

41

এর উত্তরটি বুঝতে পেরে অনেক আগেই, তবে উপস্থাপন করা হয়নি এমন ভিন্ন পদ্ধতির পোস্ট করতে চেয়েছিলেন ...

ng-initআপনার মোট টালাই ব্যবহার করুন । এইভাবে, আপনাকে HTML এ পুনরাবৃত্তি করতে হবে এবং নিয়ামকটিতে পুনরাবৃত্তি করতে হবে না। এই দৃশ্যে, আমি মনে করি এটি একটি পরিষ্কার / সরল সমাধান। (যদি টেলিং যুক্তি আরও জটিল হয় তবে আমি অবশ্যই যুক্তিটিকে যথাযথভাবে নিয়ামক বা পরিষেবায় স্থানান্তরিত করার পরামর্শ দেব would)

    <tr>
        <th>Product</th>
        <th>Quantity</th>
        <th>Price</th>
    </tr>

    <tr ng-repeat="product in cart.products">
        <td>{{product.name}}</td>
        <td>{{product.quantity}}</td>
        <td ng-init="itemTotal = product.price * product.quantity; controller.Total = controller.Total + itemTotal">{{itemTotal}} €</td>
    </tr>

    <tr>
        <td></td>
        <td>Total :</td>
        <td>{{ controller.Total }}</td> // Here is the total value of my cart
    </tr>

অবশ্যই, আপনার নিয়ামকটিতে, কেবল আপনার Totalক্ষেত্রটি সংজ্ঞায়িত / আরম্ভ করুন :

// random controller snippet
function yourController($scope..., blah) {
    var vm = this;
    vm.Total = 0;
}

4
এটি অবশ্যই সবচেয়ে কৌণিক উপায়। সরল, পঠনযোগ্য এবং ঘোষণামূলক। সুতরাং, যুক্তিটি এটি প্রতিনিধিত্ব করে যেখানে এটি সম্পর্কিত।
ড্যানিয়েল লেইজেন

এই পদ্ধতিটি সেল উপস্থাপনায় গণনাটি গোপন করে, যা এখানে বোঝা সহজ, তবে জটিল টেবিলগুলির সাথে বেশ অগোছালো হয়ে যায়।
মার্ক ডুরডিন

1
এটির সাথে অন্য সমস্যাটি হ'ল এটির দুটি উপায় বাঁধাই হয় না।
পল কার্লটন

17

আপনি মোট ভিতরে গণনা করতে পারেন ng-repeat অনুসরণ :

<tbody ng-init="total = 0">
  <tr ng-repeat="product in products">
    <td>{{ product.name }}</td>
    <td>{{ product.quantity }}</td>
    <td ng-init="$parent.total = $parent.total + (product.price * product.quantity)">${{ product.price * product.quantity }}</td>
  </tr>
  <tr>
    <td>Total</td>
    <td></td>
    <td>${{ total }}</td>
  </tr>
</tbody>

ফলাফল এখানে দেখুন: http://plnkr.co/edit/Gb8XiCf2RWiozFI3xWzp?p= পূর্বরূপ

স্বয়ংক্রিয় আপডেটের ক্ষেত্রে: http://plnkr.co/edit/QSxYbgjDjkuSH2s5JBPf?p= পূর্বরূপ (ধন্যবাদ - ভিকজর্ডান)


তালিকাটি ফিল্টার করা হলে এই কাজ করবে না - tbodyকেবল একবারে আরম্ভ করা হয়, তবে trপ্রতিটি সময় তালিকাটি ফিল্টার করা হয়, ফলস্বরূপ ভুল যোগফল হয়
জব্নেক

আপনি plnkr বা jsfiddle উপর একটি উদাহরণ তৈরি করতে পারেন?
হুই

হুম, হ্যাঁ, এটি ফিল্টারটিতে কাজ করছে না কারণ এখানে ফিল্টারটি কেবল দেখায় / লুকিয়ে রাখে, আপডেট করে না$scope
Huy Nguyen

@ হুইনগুইয়েন, আমি আপনার উপরের কোডটি সম্পাদনা করেছি। দয়া করে এখানে দেখুন: plnkr.co/edit/QSxYbgjDjkuSH2s5JBPf?p= পূর্বরূপ । এখানে আমি যা চাই তা হল যদি ব্যবহারকারী পরিমাণ পরিবর্তন করে তবে চতুর্থ কলাম (দাম * পরিমাণ) স্বয়ংক্রিয়ভাবে আপডেট হওয়া উচিত। আপনি কি দয়া করে এটি একবার দেখুন। ধন্যবাদ
বিকাশদীপ সিং

9

এটি আমার সমাধান

মিষ্টি এবং সাধারণ কাস্টম ফিল্টার:

(তবে কেবলমাত্র মূল্যবোধের সাধারণ যোগগুলির সাথে সম্পর্কিত, যোগফল নয়), আমি sumProductফিল্টার তৈরি করেছি এবং এটিকে এই পোস্টে সম্পাদনা হিসাবে সংযোজন করেছি।

angular.module('myApp', [])

    .filter('total', function () {
        return function (input, property) {
            var i = input instanceof Array ? input.length : 0;
// if property is not defined, returns length of array
// if array has zero length or if it is not an array, return zero
            if (typeof property === 'undefined' || i === 0) {
                return i;
// test if property is number so it can be counted
            } else if (isNaN(input[0][property])) {
                throw 'filter total can count only numeric values';
// finaly, do the counting and return total
            } else {
                var total = 0;
                while (i--)
                    total += input[i][property];
                return total;
            }
        };
    })

জেএস ফিডল

সম্পাদনা: যোগফল

এটি sumProductফিল্টার, এটি যে কোনও সংখ্যক আর্গুমেন্ট গ্রহণ করে। যুক্তি হিসাবে এটি ইনপুট ডেটা থেকে সম্পত্তিটির নাম স্বীকার করে এবং এটি নেস্টেড সম্পত্তি (ডট দ্বারা চিহ্নিত বাসা বাঁধতে পারে) পরিচালনা করতে পারে property.nested;

  • শূন্য আর্গুমেন্ট পাস করলে ইনপুট ডেটার দৈর্ঘ্য ফিরে আসে।
  • কেবল একটি যুক্তি পাস করলে সেই বৈশিষ্ট্যের মানগুলির সাধারণ যোগফল ফিরে আসে।
  • আরও আর্গুমেন্ট পাস করা উত্তীর্ণ হওয়া বৈশিষ্ট্যের মানের (গুণাগুণগুলির স্কেলার যোগফল) এর যোগফল প্রদান করে।

এখানে জেএস ফিডল এবং কোড

angular.module('myApp', [])
    .filter('sumProduct', function() {
        return function (input) {
            var i = input instanceof Array ? input.length : 0;
            var a = arguments.length;
            if (a === 1 || i === 0)
                return i;

            var keys = [];
            while (a-- > 1) {
                var key = arguments[a].split('.');
                var property = getNestedPropertyByKey(input[0], key);
                if (isNaN(property))
                    throw 'filter sumProduct can count only numeric values';
                keys.push(key);
            }

            var total = 0;
            while (i--) {
                var product = 1;
                for (var k = 0; k < keys.length; k++)
                    product *= getNestedPropertyByKey(input[i], keys[k]);
                total += product;
            }
            return total;

            function getNestedPropertyByKey(data, key) {
                for (var j = 0; j < key.length; j++)
                    data = data[key[j]];
                return data;
            }
        }
    })

জেএস ফিডল


4

সরল সমাধান

এখানে একটি সহজ সমাধান। লুপের জন্য অতিরিক্ত কোনও দরকার নেই।

এইচটিএমএল অংশ

         <table ng-init="ResetTotalAmt()">
                <tr>
                    <th>Product</th>
                    <th>Quantity</th>
                    <th>Price</th>
                </tr>

                <tr ng-repeat="product in cart.products">
                    <td ng-init="CalculateSum(product)">{{product.name}}</td>
                    <td>{{product.quantity}}</td>
                    <td>{{product.price * product.quantity}} €</td>
                </tr>

                <tr>
                    <td></td>
                    <td>Total :</td>
                    <td>{{cart.TotalAmt}}</td> // Here is the total value of my cart
                </tr>

           </table>

স্ক্রিপ্ট অংশ

 $scope.cart.TotalAmt = 0;
 $scope.CalculateSum= function (product) {
   $scope.cart.TotalAmt += (product.price * product.quantity);
 }
//It is enough to Write code $scope.cart.TotalAmt =0; in the function where the cart.products get allocated value. 
$scope.ResetTotalAmt = function (product) {
   $scope.cart.TotalAmt =0;
 }

3

এটি সমাধানের আরও একটি উপায়, এই বিশেষ গণনাটি সমাধান করার জন্য ভ্যাক্লাভের উত্তর থেকে প্রসারিত - অর্থাত্ প্রতিটি সারিতে একটি গণনা।

    .filter('total', function () {
        return function (input, property) {
            var i = input instanceof Array ? input.length : 0;
            if (typeof property === 'undefined' || i === 0) {
                return i;
            } else if (typeof property === 'function') {
                var total = 0; 
                while (i--)
                    total += property(input[i]);
                return total;
            } else if (isNaN(input[0][property])) {
                throw 'filter total can count only numeric values';
            } else {
                var total = 0;
                while (i--)
                    total += input[i][property];
                return total;
            }
        };
    })

একটি গণনা দিয়ে এটি করার জন্য, কেবল আপনার সুযোগে একটি গণনা ফাংশন যুক্ত করুন, যেমন

$scope.calcItemTotal = function(v) { return v.price*v.quantity; };

আপনি {{ datas|total:calcItemTotal|currency }}আপনার এইচটিএমএল কোডটি ব্যবহার করবেন । প্রতিটি ডাইজেস্টের জন্য ডাকা না হওয়ার সুবিধা রয়েছে কারণ এটি ফিল্টার ব্যবহার করে এবং সাধারণ বা জটিল মোটের জন্য ব্যবহার করা যেতে পারে।

JSFiddle


3

এটি এনজি-রিপিট এবং এনজি-থিম সহ সমস্ত মানকে একত্রিত করতে এবং আইটেম.মোট সম্পত্তি সহ মডেলটিকে প্রসারিত করার একটি সহজ উপায়।

<table>
<tr ng-repeat="item in items" ng-init="setTotals(item)">
                    <td>{{item.name}}</td>
                    <td>{{item.quantity}}</td>
                    <td>{{item.unitCost | number:2}}</td>
                    <td>{{item.total | number:2}}</td>
</tr>
<tr class="bg-warning">
                    <td>Totals</td>
                    <td>{{invoiceCount}}</td>
                    <td></td>                    
                    <td>{{invoiceTotal | number:2}}</td>
                </tr>
</table>

এনজিআইএনট নির্দেশিকা প্রতিটি আইটেমের জন্য সেট মোট ফাংশন কল করে। কন্ট্রোলারে সেটটটল ফাংশন মোট প্রতিটি আইটেম গণনা করে। এটি সমস্ত আইটেমের পরিমাণ এবং মোটকে মোট (যোগফল) করতে ইনভয়েসকাউন্ট এবং ইনভয়েসটোটাল স্কোপ ভেরিয়েবলগুলিও ব্যবহার করে।

$scope.setTotals = function(item){
        if (item){
            item.total = item.quantity * item.unitCost;
            $scope.invoiceCount += item.quantity;
            $scope.invoiceTotal += item.total;
        }
    }

আরও তথ্যের জন্য এবং ডেমো এই লিঙ্কটি দেখুন:

http://www.ozkary.com/2015/06/angularjs-calculate-totals-using.html


1
আপনার ব্লগ পোস্টে লিঙ্কগুলি যে লিঙ্কটি মৃত হতে পারে স্ট্যাক ওভারলোতে নিরুৎসাহিত করা হয়েছে। এছাড়াও, যখন পৃষ্ঠাটি দেখি তখন আমি আপনার পৃষ্ঠার মাঝখানে একটি 502 ব্যাড গেটওয়ে ত্রুটি পাই। অন্য কোথাও একটি লিঙ্ক না এই মুহুর্তে প্রশ্নের উত্তর দিন।
রিক গ্লোভ

3

আমি মার্জিত সমাধান পছন্দ

টেমপ্লেটে

<td>Total: {{ totalSum }}</td>

নিয়ামক মধ্যে

$scope.totalSum = Object.keys(cart.products).map(function(k){
    return +cart.products[k].price;
}).reduce(function(a,b){ return a + b },0);

আপনি যদি ES2015 (ওরফে ES6) ব্যবহার করছেন

$scope.totalSum = Object.keys(cart.products)
  .map(k => +cart.products[k].price)
  .reduce((a, b) => a + b);

2

আপনি একটি কাস্টম কৌণিক ফিল্টার ব্যবহার করতে পারেন যা ডেটাসেট অবজেক্ট অ্যারে এবং প্রতিটি বস্তুর কীটি যোগ করে। এর পরে ফিল্টারটি যোগফলটি ফিরিয়ে দিতে পারে:

.filter('sumColumn', function(){
        return function(dataSet, columnToSum){
            let sum = 0;

            for(let i = 0; i < dataSet.length; i++){
                sum += parseFloat(dataSet[i][columnToSum]) || 0;
            }

            return sum;
        };
    })

তারপরে আপনার টেবিলে একটি কলামের যোগফল ব্যবহার করতে পারেন:

<th>{{ dataSet | sumColumn: 'keyInObjectToSum' }}</th>

1

আপনি কৌণিক জেএস এর পরিষেবাগুলি ব্যবহার করার চেষ্টা করতে পারেন, এটি আমার পক্ষে কাজ করেছে .. নীচে কোড স্নিপেট দেওয়া

নিয়ামক কোড:

$scope.total = 0;
var aCart = new CartService();

$scope.addItemToCart = function (product) {
    aCart.addCartTotal(product.Price);
};

$scope.showCart = function () {    
    $scope.total = aCart.getCartTotal();
};

পরিষেবা কোড:

app.service("CartService", function () {

    Total = [];
    Total.length = 0;

    return function () {

        this.addCartTotal = function (inTotal) {
            Total.push( inTotal);
        }

        this.getCartTotal = function () {
            var sum = 0;
            for (var i = 0; i < Total.length; i++) {
                sum += parseInt(Total[i], 10); 
            }
            return sum;
        }
    };
});

1

এই সমস্যার সমাধান এখানে দেওয়া হল:

<td>Total: {{ calculateTotal() }}</td>

লিপি

$scope.calculateVAT = function () {
    return $scope.cart.products.reduce((accumulator, currentValue) => accumulator + (currentValue.price * currentValue.quantity), 0);
};

হ্রাস পণ্য অ্যারে প্রতিটি পণ্যের জন্য কার্যকর করা হবে। সঞ্চালক হ'ল মোট জমা পরিমাণ, কারেন্টভ্যালু অ্যারের বর্তমান উপাদান এবং সর্বশেষে 0 হল প্রাথমিক মান


0

আমি রাজাশিল্পার উত্তরে কিছুটা প্রসারিত করেছি। আপনি সিনট্যাক্স এর মতো ব্যবহার করতে পারেন:

{{object | sumOfTwoValues:'quantity':'products.productWeight'}}

যাতে আপনি কোনও বস্তুর শিশু অবজেক্ট অ্যাক্সেস করতে পারেন। ফিল্টারটির জন্য কোডটি এখানে:

.filter('sumOfTwoValues', function () {
    return function (data, key1, key2) {
        if (typeof (data) === 'undefined' || typeof (key1) === 'undefined' || typeof (key2) === 'undefined') {
            return 0;
        }
        var keyObjects1 = key1.split('.');
        var keyObjects2 = key2.split('.');
        var sum = 0;
        for (i = 0; i < data.length; i++) {
            var value1 = data[i];
            var value2 = data[i];
            for (j = 0; j < keyObjects1.length; j++) {
                value1 = value1[keyObjects1[j]];
            }
            for (k = 0; k < keyObjects2.length; k++) {
                value2 = value2[keyObjects2[k]];
            }
            sum = sum + (value1 * value2);
        }
        return sum;
    }
});

0

ভ্যাক্লাভের উত্তর নেওয়া এবং আরও কৌণিকের মতো করে তোলা:

angular.module('myApp').filter('total', ['$parse', function ($parse) {
    return function (input, property) {
        var i = input instanceof Array ? input.length : 0,
            p = $parse(property);

        if (typeof property === 'undefined' || i === 0) {
            return i;
        } else if (isNaN(p(input[0]))) {
            throw 'filter total can count only numeric values';
        } else {
            var total = 0;
            while (i--)
                total += p(input[i]);
            return total;
        }
    };
}]);

এটি আপনাকে নেস্টেড এবং অ্যারে ডেটা এমনকি অ্যাক্সেস করার সুবিধা দেয়:

{{data | total:'values[0].value'}}

0

এইচটিএমএলে

<b class="text-primary">Total Amount: ${{ data.allTicketsTotalPrice() }}</b>

জাভাস্ক্রিপ্টে

  app.controller('myController', function ($http) {
            var vm = this;          
            vm.allTicketsTotalPrice = function () {
                var totalPrice = 0;
                angular.forEach(vm.ticketTotalPrice, function (value, key) {
                    totalPrice += parseFloat(value);
                });
                return totalPrice.toFixed(2);
            };
        });

0

হুই এনগুইনের উত্তর প্রায় আছে there এটি কার্যকর করতে, যুক্ত করুন:

ng-repeat="_ in [ products ]"

... এনজি-ইআর দিয়ে লাইনে। তালিকায় সর্বদা একটি একক আইটেম থাকে, সুতরাং কৌণিকটি ঠিক একবারে ব্লকটি পুনরাবৃত্তি করবে।

ফিল্টারিং ব্যবহার করে জাইবনেকের ডেমো যুক্ত করে কাজটি করা যেতে পারে:

ng-repeat="_ in [ [ products, search ] ]"

Http://plnkr.co/edit/dLSntiy8EyahZ0upDpgy?p= পূর্বরূপ দেখুন ।


0
**Angular 6: Grand Total**       
 **<h2 align="center">Usage Details Of {{profile$.firstName}}</h2>
        <table align ="center">
          <tr>
            <th>Call Usage</th>
            <th>Data Usage</th>
            <th>SMS Usage</th>
            <th>Total Bill</th>
          </tr>
          <tr>
          <tr *ngFor="let user of bills$">
            <td>{{ user.callUsage}}</td>
            <td>{{ user.dataUsage }}</td>
            <td>{{ user.smsUsage }}</td>
       <td>{{user.callUsage *2 + user.dataUsage *1 + user.smsUsage *1}}</td>
          </tr>


          <tr>
            <th> </th>
            <th>Grand Total</th>
            <th></th>
            <td>{{total( bills$)}}</td>
          </tr>
        </table>**


    **Controller:**
        total(bills) {
            var total = 0;
            bills.forEach(element => {
total = total + (element.callUsage * 2 + element.dataUsage * 1 + element.smsUsage * 1);
            });
            return total;
        }

পর্যালোচনা থেকে: স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম! দয়া করে কেবল উত্স কোড দিয়ে উত্তর দিবেন না। আপনার সমাধান কীভাবে কাজ করে সে সম্পর্কে একটি দুর্দান্ত বর্ণনা দেওয়ার চেষ্টা করুন। দেখুন: আমি কীভাবে ভাল উত্তর লিখব? । ধন্যবাদ
সানু ıɔ কিউপি

0

এটি আমার সমাধান

<div ng-controller="MainCtrl as mc">
  <ul>
      <li ng-repeat="n in [1,2,3,4]" ng-init="mc.sum = ($first ? 0 : mc.sum) + n">{{n}}</li>
      <li>sum : {{mc.sum}}</li>
  </ul>
</div>

এটির জন্য আপনাকে কন্ট্রোলারে নাম যুক্ত করা দরকার Controller as SomeNameযাতে আমরা সেখানে পরিবর্তনশীলকে ক্যাশে করতে পারি (এটি কি সত্যই প্রয়োজন? আমি প্যারেন্ট ব্যবহার করার সাথে পরিচিত নই যাতে আমি জানি না)

তারপরে প্রতিটি পুনরাবৃত্তির জন্য যুক্ত করুন ng-init"SomeName.SumVariable = ($first ? 0 : SomeName.SumVariable) + repeatValue"

$first এটি যাচাইয়ের জন্য প্রথমে এটি আবার শূন্যে পুনরায় সেট করুন, অন্যথায় এটি সামগ্রিক মান অবিরত করবে

http://jsfiddle.net/thainayu/harcv74f/


-2

এখানে সমস্ত উত্তর পড়ার পরে - গোষ্ঠীভুক্ত তথ্যের সংক্ষিপ্ত বিবরণ কীভাবে, আমি এগুলি এড়িয়ে যাবার সিদ্ধান্ত নিয়েছি এবং এসকিউএল জাভাস্ক্রিপ্ট লাইব্রেরিগুলির মধ্যে একটি লোড করেছি। আমি আলাস্কল ব্যবহার করছি, হ্যাঁ এটি লোড সময়টিতে কয়েক সেকেন্ড বেশি সময় নেয় তবে কোডিং এবং ডিবাগিংয়ে অগণিত সময় সাশ্রয় করে, এখন গ্রুপ এবং যোগফল () আমি কেবল ব্যবহার করি,

$scope.bySchool = alasql('SELECT School, SUM(Cost) AS Cost from ? GROUP BY School',[restResults]);

আমি জানি এটি কৌণিক / জেএসের উপর কিছুটা রেন্টের মতো শোনাচ্ছে তবে সত্যই এসকিউএল 30+ বছর আগে এটি সমাধান করেছে এবং আমাদের এটি ব্রাউজারের মধ্যে পুনরায় আবিষ্কার করতে হবে না।


1
এটা ঠিক ভয়াবহ। কেবল বাহ এসএমএইচ - আমি অন্য লোককে ভোট দিতে দেব। এই উত্তর দিয়ে আমার মুখটি প্রশস্ত। .....
টম স্টিকেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.