AngularJS বাইন্ডিংগুলিতে ম্যাথ ফাংশন


232

AngularJS বাইন্ডিংগুলিতে গণিত ফাংশনগুলি ব্যবহার করার কোনও উপায় আছে কি?

যেমন

<p>The percentage is {{Math.round(100*count/total)}}%</p>

এই ফিডল সমস্যাটি দেখায়

http://jsfiddle.net/ricick/jtA99/1/


11
অন্য বিকল্পটি হ'ল পরিবর্তে ফিল্টার ব্যবহার করে আপনার টেম্পলেটগুলিতে ম্যাথ ব্যবহার করা এড়ানো: <p>The percentage is {{(100*count/total)| number:0}}%</p>নীচের মন্তব্যে আরও কিছু।
অ্যান্ড্রু কুকলেউইকজ

2
Angular2 এর জন্য, কোনও উপাদান সদস্যকে সংজ্ঞায়িত করুন private Math = Math;এবং আপনি এটি ব্যবহার করতে পারেন।
ওন্দ্র ŽiŽka

উত্তর:


329

আপনাকে আপনার স্কোপটিতে ইনজেকশন দিতে Mathহবে, যদি আপনাকে এটি $scopeম্যাথ সম্পর্কে কিছুই না জানার দরকার হয় ।

সহজ উপায়, আপনি করতে পারেন

$scope.Math = window.Math;

আপনার নিয়ামক মধ্যে। সঠিকভাবে এটি করার কৌনিক উপায়টি একটি গণিত পরিষেবা তৈরি করা হবে বলে আমার ধারণা।


1
ধন্যবাদ। আমার একটি ব্যবহারের কেস রয়েছে যেখানে আমার সম্পূর্ণ ভিন্ন যুক্তিযুক্ত একাধিক টেম্পলেট রয়েছে এবং যতটা সম্ভব সম্ভব বিচ্ছিন্ন করতে চাই। পারফেক্ট
ইয়াবলারগো

48
আপনার কোনও ফিল্টার ব্যবহার করা উচিত, ম্যাথ অবজেক্টটিকে স্কোপে রাখা উচিত নয়।
সোভিয়েট

4
এটি দ্রুত এবং নোংরা জিনিসের জন্য ভাল; দ্রুত কিছু উপহাস করা বা কীভাবে কীভাবে কাজ হয় তা দেখতে চান। যা সম্ভবত তাদের এইচটিএমএল টেম্পলেট ফাইলগুলিতে গণিত করতে চায়।
ল্যান

1
বাইন্ডিংগুলিতে ফাংশনগুলি ব্যবহার করা প্রতিটি স্কোপের আপডেটে কল করার জন্য ফাংশনটি তৈরি করবে এবং খুব বেশি সংস্থান ব্যবহার করবে।
desmati

এই সমাধানটি ভুল । কেন? 1- বৈশ্বিক সুযোগকে দূষিত করা এখন পর্যন্ত সবচেয়ে খারাপ ধারণা। 2- মতামত দায়ী formatting, সুতরাং পরিবর্তে ফিল্টার ব্যবহার করুন।
আফশিন মেহরাবানি

304

যদিও স্বীকৃত উত্তরটি সঠিক যে আপনি এটি কৌণিকভাবে Mathএটি ব্যবহার করতে ইনজেক্ট করতে পারেন, এই নির্দিষ্ট সমস্যার জন্য, আরও প্রচলিত / কৌণিক উপায়ে নম্বর ফিল্টারটি রয়েছে:

<p>The percentage is {{(100*count/total)| number:0}}%</p>

আপনি numberএখানে ফিল্টার সম্পর্কে আরও পড়তে পারেন : http://docs.angularjs.org/api/ng/filter/number


7
এটি কেবল কৌণিক উপায়ই নয়, এটি সঠিক উপায়। মানটির 'বিন্যাস' করাটাই ভিউয়ের দায়িত্ব।
লুক

39
অ্যান্ড্রু, এই মন্তব্যটি দিয়ে আপনার পোস্টে বিশৃঙ্খলার জন্য দুঃখিত। আপনার উত্তর ভাল এবং সহায়ক; তবে আমি অন্যান্য মন্তব্যের সাথে একমত হতে চাই। লোকেরা "কৌণিক উপায়ে" টাউট করার সময় আমি প্রায়শই ক্রিংজ করি যদিও এটি নিখুঁত বিকাশের কোনও উপমা। এটা না। ওপি সাধারণভাবে জিজ্ঞাসা করেছিল যে গণিতের কাজগুলি কীভাবে একটি বাধ্যতামূলকভাবে অন্তর্ভুক্ত করা যায়, কেবল গোল হিসাবে কেবল উদাহরণ হিসাবে উপস্থাপন করা হয়। যদিও এই উত্তরটি সঠিকভাবে একটি গণিত সমস্যা সমাধানের জন্য পিউরিস্টদের দ্বারা "কৌণিক উপায়ে" হতে পারে, তবে এটি প্রশ্নের পুরোপুরি উত্তর দেয় না।
kbrimington

1
প্রত্নতত্ত্বের জন্য দুঃখিত, তবে আউটপুট হিসাবে আপনার যখন একটি নম্বর প্রয়োজন তখন এটি ভুল হয়। {{1234.567|number:2}}উপস্থাপনা যেমন 1,234.57বা 1 234,57। যদি আপনি এটি পাস করার চেষ্টা করেন তবে <input type="number" ng-value="1234.567|number:2">ইনপুট খালি হয়ে যাবে, মানটি সঠিক নম্বর নয়, তবে স্থানীয়ভাবে নির্ভর স্ট্রিং প্রতিনিধিত্ব করে।
সোয়িল্ক

61

আমি মনে করি এটির সর্বোত্তম উপায় হ'ল এটির মতো একটি ফিল্টার তৈরি করা:

myModule.filter('ceil', function() {
    return function(input) {
        return Math.ceil(input);
    };
});

তারপরে মার্কআপটি এর মতো দেখাচ্ছে:

<p>The percentage is {{ (100*count/total) | ceil }}%</p>

আপডেট করা ফিডাল: http://jsfiddle.net/BB4T4/


ক্ল্যাক্সনের উত্তরে প্রদত্ত নম্বর ফিল্টারটি ইতিমধ্যে সিলটি করবে, সুতরাং এর প্রয়োজন নেই।
কিম

আমি অনুরূপ কিছু করেছি, কেবল টাইমারটি তৈরি করতে ফিল্টারটি ব্যবহার করে যেমনটি চেয়েছিলাম। অন্য কথায়, আমি কাস্টম ফিল্টার ব্যবহারের মতো ফিট দেখে আমি বর্তমান সময়টি নেব এবং এটিকে স্ট্রিংয়ে ফর্ম্যাট করব। এছাড়াও আপনি যখন নিজের সংখ্যাগুলি গোল করতে চান তবে সংখ্যা ফিল্টারটি ভাল তবে তল এবং সিলিং কার্যের জন্য এটি অকেজো।
গ্যাব্রিয়েল লাভট্রো

37

এটি উত্তর দেওয়ার মতো লোমশ, কারণ আপনি যা করছেন তার পুরো প্রসঙ্গটি আপনি দেন নি। গৃহীত উত্তরটি কাজ করবে তবে কিছু ক্ষেত্রে খারাপ পারফরম্যান্সের কারণ হবে। এটি, এবং এটি পরীক্ষা করা আরও কঠিন হতে চলেছে।

আপনি যদি এটি একটি স্ট্যাটিক ফর্মের অংশ হিসাবে করছেন তবে ঠিক আছে। গৃহীত উত্তরটি কার্যকর হবে, এমনকি এটি পরীক্ষা করা সহজ না হলেও এবং এটি হিনকি।

আপনি যদি এই সম্পর্কে "কৌণিক" হতে চান:

আপনি যে কোনও "ব্যবসায়িক যুক্তি" (অর্থাত্ যুক্তি প্রদর্শিত হবে যা ডেটা প্রদর্শিত হতে পারে) আপনার দৃষ্টিভঙ্গির বাইরে রাখতে চাইবেন। এটি তাই আপনি আপনার যুক্তি পরীক্ষা করতে পারেন এবং যাতে আপনি আপনার নিয়ামক এবং আপনার দৃশ্যের জোড় জোড় করে শেষ করবেন না। তাত্ত্বিকভাবে, আপনার নিয়ামকটিকে অন্য দর্শনে দেখানো এবং স্কোপগুলি থেকে একই মানগুলি ব্যবহার করতে সক্ষম হওয়া উচিত। (যদি তা বোঝা যায়)

আপনি এটিও বিবেচনা করতে চাইবেন যে কোনও বাঁধার অভ্যন্তরের যে কোনও ফাংশন কলগুলি (যেমন {{}}বা ng-bindবা ng-bind-html) প্রতিটি ডাইজেস্টের উপর মূল্যায়ন করতে হবে , কারণ কৌণিকের জানার কোনও উপায় নেই যে কোনও মানের সাথে এটির পরিবর্তন হয়েছে কি না তা পছন্দ করে knowing সুযোগ এ।

এটি করার "কৌণিক" উপায়টি হ'ল এনজি-চেঞ্জ ইভেন্ট বা এমনকি একটি ঘড়ি ব্যবহার করে পরিবর্তনের সুযোগের কোনও সম্পত্তিতে থাকা মূল্যকে ক্যাশে করা।

একটি স্থির ফর্ম সহ উদাহরণস্বরূপ:

angular.controller('MainCtrl', function($scope, $window) {
   $scope.count = 0;
   $scope.total = 1;

   $scope.updatePercentage = function () {
      $scope.percentage = $window.Math.round((100 * $scope.count) / $scope.total);
   };
});
<form name="calcForm">
   <label>Count <input name="count" ng-model="count" 
                  ng-change="updatePercentage()"
                  type="number" min="0" required/></label><br/>
   <label>Total <input name="total" ng-model="total"
                  ng-change="updatePercentage()"
                  type="number" min="1" required/></label><br/>
   <hr/>
   Percentage: {{percentage}}
</form>

এবং এখন আপনি এটি পরীক্ষা করতে পারেন!

describe('Testing percentage controller', function() {
  var $scope = null;
  var ctrl = null;

  //you need to indicate your module in a test
  beforeEach(module('plunker'));

  beforeEach(inject(function($rootScope, $controller) {
    $scope = $rootScope.$new();

    ctrl = $controller('MainCtrl', {
      $scope: $scope
    });
  }));

  it('should calculate percentages properly', function() {
    $scope.count = 1;
    $scope.total = 1;
    $scope.updatePercentage();
    expect($scope.percentage).toEqual(100);

    $scope.count = 1;
    $scope.total = 2;
    $scope.updatePercentage();
    expect($scope.percentage).toEqual(50);

    $scope.count = 497;
    $scope.total = 10000;
    $scope.updatePercentage();
    expect($scope.percentage).toEqual(5); //4.97% rounded up.

    $scope.count = 231;
    $scope.total = 10000;
    $scope.updatePercentage();
    expect($scope.percentage).toEqual(2); //2.31% rounded down.
  });
});

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

ভাল উত্তর. তবে কেন ভাবছেন $windowযেহেতু এটি কেবল পরিকল্পনার সাথেই কাজ করছে বলে প্রিপেন্ড করা হচ্ছে Math.round()?
নীল

3
@ নীল - $ উইন্ডো আপনাকে আরও সহজে Mathপরীক্ষার জন্য উপহাস করতে দেয় । পরিবর্তে, আপনি একটি গণিত পরিষেবা তৈরি করতে এবং এটি ইনজেকশন করতে পারে।
বেন লেশ

8

ফিল্টারে পুরো গণিতের আপত্তি কেন গুটিয়ে রাখবেন না?

var app = angular.module('fMathFilters',[]);


function math() {
    return function(input,arg) {
        if(input) {
            return Math[arg](input);
        }

        return 0;
    }
}

return app.filter('math',[math]);

এবং ব্যবহার করতে:

। {সংখ্যা_ভার | গণিত: 'ছাদের নিচের পিঠ নির্মাণ'}}



6

আপনি যদি কৌণিক কোনও সাধারণ বৃত্তান্ত করতে চান তবে আপনি সহজেই আপনার অভিব্যক্তির ভিতরে ফিল্টার সেট করতে পারেন। উদাহরণ স্বরূপ:

{{ val | number:0 }}

এই কোডপেন উদাহরণটি দেখুন এবং অন্যান্য নম্বর ফিল্টার বিকল্পগুলির জন্য।

নম্বর ফিল্টার ব্যবহার করে কৌনিক ডক্স


6

কৌণিকের সাথে সহজ গণিত করার সহজতম উপায় হ'ল আপনার পৃষ্ঠাতে ভর গণনা করার দরকার নেই বলে ধরে নেওয়া, প্রয়োজন অনুসারে পৃথক বাইন্ডিংয়ের জন্য সরাসরি HTML মার্কআপে। এখানে একটি উদাহরণ:

{{(data.input/data.input2)| number}} 

এই ক্ষেত্রে আপনি কেবল () তে গণিত করুন এবং তারপরে একটি ফিল্টার ব্যবহার করুন একটি নম্বর উত্তর পেতে। পাঠ্য হিসাবে কৌণিক সংখ্যা ফরম্যাটে আরও তথ্য এখানে:

https://docs.angularjs.org/api/ng/filter


4

হয় স্কোলে গ্লোবাল ম্যাথ অবজেক্টটি বেঁধে রাখুন (উইন্ডো নয় উইন্ডোটি ব্যবহার করার কথা মনে রাখবেন)

$scope.abs = $window.Math.abs;

আপনার HTML এ বাঁধাই ব্যবহার করুন:

<p>Distance from zero: {{abs(distance)}}</p>

অথবা আপনার পরে যে নির্দিষ্ট ম্যাথ ফাংশন রয়েছে তার জন্য একটি ফিল্টার তৈরি করুন:

module.filter('abs', ['$window', function($window) {
  return function(n) {
    return $window.Math.abs($window.parseInt(n));
  };
});

আপনার এইচটিএমএলে ফিল্টারটি ব্যবহার করুন:

<p>Distance from zero: {{distance | abs}}</p>

2

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

আমার পরামর্শ হ'ল একটি ফিল্টার তৈরি করা। এটি কৌণিক উপায়।

myModule.filter('ceil', function() {
    return function(input) {
        return Math.ceil(input);
    };
});

তারপরে আপনার এইচটিএমএলে এটি করুন:

<p>The percentage is {{ (100*count/total) | ceil }}%</p>

1

numberফিল্টার সহস্র বিভাজক সঙ্গে সংখ্যা বিন্যাস, তাই এটি কঠোরভাবে একটি গণিত ফাংশন নয়।

তদুপরি, এর দশমিক 'সীমাবদ্ধ' ceilকোনও কাটা দশমিক নয় (যেমন কিছু অন্যান্য উত্তর আপনাকে বিশ্বাসের দিকে পরিচালিত করবে), বরং roundসেগুলি যুক্ত করে।

সুতরাং আপনার যে কোনও গণিতের ক্রিয়াকলাপের জন্য, আপনি এটির মতো করে করতে পারেন (পুরো ম্যাথ অবজেক্টটি ইনজেকশন দেওয়ার চেয়ে বিদ্রূপ করা সহজ):

myModule.filter('ceil', function () {
  return Math.ceil;
});

এটি অন্য ফাংশনে মোড়ানোর দরকার নেই।


0

এটি কম-বেশি তিনটি উত্তরের সংক্ষিপ্তসার (সারা ইনস ক্যাল্ডারন, ক্লেক্সন এবং গোথবার্জ দ্বারা), তবে তারা সবাই গুরুত্বপূর্ণ কিছু যুক্ত করেছে, আমি সমাধানগুলিতে যোগ দেওয়া এবং আরও কিছু ব্যাখ্যা যুক্ত করার বিষয়টি বিবেচনা করি।

আপনার উদাহরণ বিবেচনা করে, আপনি আপনার টেম্পলেটটিতে গণনাগুলি ব্যবহার করে করতে পারেন:

{{ 100 * (count/total) }}

তবে এর ফলে দশমিক জায়গাগুলি পুরোপুরি সঞ্চারিত হতে পারে, তাই ফিল্টারগুলি ব্যবহার করার একটি ভাল উপায়:

{{ 100 * (count/total) | number }}

ডিফল্টরূপে, নম্বর ফিল্টারটি তিনটি ভগ্নাংশের সংখ্যা ছাড়বে , এখানেই ফ্র্যাকশনসাইজ যুক্তিটি বেশ কাজে আসে ( {{ 100 * (count/total) | number:fractionSize }}), যা আপনার ক্ষেত্রে হবে:

{{ 100 * (count/total) | number:0 }}

এটি ইতিমধ্যে ফলাফলটিও গোল করবে:

শেষ কথাটি উল্লেখ করার মতো, আপনি যদি কোনও বাহ্যিক ডেটা উত্সের উপর নির্ভর করেন তবে সঠিক ফলব্যাক মান প্রদান করা সম্ভবত ভাল অনুশীলন (অন্যথায় আপনি আপনার সাইটে NaN বা কিছুই দেখতে পাবেন না):

{{ (100 * (count/total) | number:0) || 0 }}

সিডিনোট: আপনার নির্দিষ্টকরণের উপর নির্ভর করে আপনি ইতিমধ্যে আপনার নিম্ন স্তরের (যেমন {{(100 * (count || 10)/ (total || 100) | number:2)}}) নীচের স্তরে ফ্যালব্যাকগুলি সংজ্ঞায়িত ফ্যালব্যাকগুলির সাথে আরও সুনির্দিষ্ট হতে পারবেন । যদিও, এটি সর্বদা বুদ্ধিমান নাও হতে পারে ..


0

কৌণিক টাইপস্ক্রিপ্ট উদাহরণ পাইপ ব্যবহার করে।

math.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'math',
})

export class MathPipe implements PipeTransform {

  transform(value: number, args: any = null):any {
      if(value) {
        return Math[args](value);
      }
      return 0;
  }
}

@ এনজিএমডিউল ঘোষণায় যুক্ত করুন

@NgModule({
  declarations: [
    MathPipe,

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

{{(100*count/total) | math:'round'}}

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