AngularJS বাইন্ডিংগুলিতে গণিত ফাংশনগুলি ব্যবহার করার কোনও উপায় আছে কি?
যেমন
<p>The percentage is {{Math.round(100*count/total)}}%</p>
এই ফিডল সমস্যাটি দেখায়
private Math = Math;
এবং আপনি এটি ব্যবহার করতে পারেন।
AngularJS বাইন্ডিংগুলিতে গণিত ফাংশনগুলি ব্যবহার করার কোনও উপায় আছে কি?
যেমন
<p>The percentage is {{Math.round(100*count/total)}}%</p>
এই ফিডল সমস্যাটি দেখায়
private Math = Math;
এবং আপনি এটি ব্যবহার করতে পারেন।
উত্তর:
আপনাকে আপনার স্কোপটিতে ইনজেকশন দিতে Math
হবে, যদি আপনাকে এটি $scope
ম্যাথ সম্পর্কে কিছুই না জানার দরকার হয়
।
সহজ উপায়, আপনি করতে পারেন
$scope.Math = window.Math;
আপনার নিয়ামক মধ্যে। সঠিকভাবে এটি করার কৌনিক উপায়টি একটি গণিত পরিষেবা তৈরি করা হবে বলে আমার ধারণা।
formatting
, সুতরাং পরিবর্তে ফিল্টার ব্যবহার করুন।
যদিও স্বীকৃত উত্তরটি সঠিক যে আপনি এটি কৌণিকভাবে Math
এটি ব্যবহার করতে ইনজেক্ট করতে পারেন, এই নির্দিষ্ট সমস্যার জন্য, আরও প্রচলিত / কৌণিক উপায়ে নম্বর ফিল্টারটি রয়েছে:
<p>The percentage is {{(100*count/total)| number:0}}%</p>
আপনি number
এখানে ফিল্টার সম্পর্কে আরও পড়তে পারেন : http://docs.angularjs.org/api/ng/filter/number
{{1234.567|number:2}}
উপস্থাপনা যেমন 1,234.57
বা 1 234,57
। যদি আপনি এটি পাস করার চেষ্টা করেন তবে <input type="number" ng-value="1234.567|number:2">
ইনপুট খালি হয়ে যাবে, মানটি সঠিক নম্বর নয়, তবে স্থানীয়ভাবে নির্ভর স্ট্রিং প্রতিনিধিত্ব করে।
আমি মনে করি এটির সর্বোত্তম উপায় হ'ল এটির মতো একটি ফিল্টার তৈরি করা:
myModule.filter('ceil', function() {
return function(input) {
return Math.ceil(input);
};
});
তারপরে মার্কআপটি এর মতো দেখাচ্ছে:
<p>The percentage is {{ (100*count/total) | ceil }}%</p>
আপডেট করা ফিডাল: http://jsfiddle.net/BB4T4/
এটি উত্তর দেওয়ার মতো লোমশ, কারণ আপনি যা করছেন তার পুরো প্রসঙ্গটি আপনি দেন নি। গৃহীত উত্তরটি কাজ করবে তবে কিছু ক্ষেত্রে খারাপ পারফরম্যান্সের কারণ হবে। এটি, এবং এটি পরীক্ষা করা আরও কঠিন হতে চলেছে।
আপনি যদি এটি একটি স্ট্যাটিক ফর্মের অংশ হিসাবে করছেন তবে ঠিক আছে। গৃহীত উত্তরটি কার্যকর হবে, এমনকি এটি পরীক্ষা করা সহজ না হলেও এবং এটি হিনকি।
আপনি যে কোনও "ব্যবসায়িক যুক্তি" (অর্থাত্ যুক্তি প্রদর্শিত হবে যা ডেটা প্রদর্শিত হতে পারে) আপনার দৃষ্টিভঙ্গির বাইরে রাখতে চাইবেন। এটি তাই আপনি আপনার যুক্তি পরীক্ষা করতে পারেন এবং যাতে আপনি আপনার নিয়ামক এবং আপনার দৃশ্যের জোড় জোড় করে শেষ করবেন না। তাত্ত্বিকভাবে, আপনার নিয়ামকটিকে অন্য দর্শনে দেখানো এবং স্কোপগুলি থেকে একই মানগুলি ব্যবহার করতে সক্ষম হওয়া উচিত। (যদি তা বোঝা যায়)
আপনি এটিও বিবেচনা করতে চাইবেন যে কোনও বাঁধার অভ্যন্তরের যে কোনও ফাংশন কলগুলি (যেমন {{}}
বা 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()
?
Math
পরীক্ষার জন্য উপহাস করতে দেয় । পরিবর্তে, আপনি একটি গণিত পরিষেবা তৈরি করতে এবং এটি ইনজেকশন করতে পারে।
ফিল্টারে পুরো গণিতের আপত্তি কেন গুটিয়ে রাখবেন না?
var app = angular.module('fMathFilters',[]);
function math() {
return function(input,arg) {
if(input) {
return Math[arg](input);
}
return 0;
}
}
return app.filter('math',[math]);
এবং ব্যবহার করতে:
। {সংখ্যা_ভার | গণিত: 'ছাদের নিচের পিঠ নির্মাণ'}}
আরও ভাল বিকল্পটি ব্যবহার করা হয়:
{{(100*score/questionCounter) || 0 | number:0}}
মানগুলি আরম্ভ না করা ক্ষেত্রে এটি সমীকরণের ডিফল্ট মান 0 তে নির্ধারণ করে।
আপনি যদি কৌণিক কোনও সাধারণ বৃত্তান্ত করতে চান তবে আপনি সহজেই আপনার অভিব্যক্তির ভিতরে ফিল্টার সেট করতে পারেন। উদাহরণ স্বরূপ:
{{ val | number:0 }}
এই কোডপেন উদাহরণটি দেখুন এবং অন্যান্য নম্বর ফিল্টার বিকল্পগুলির জন্য।
কৌণিকের সাথে সহজ গণিত করার সহজতম উপায় হ'ল আপনার পৃষ্ঠাতে ভর গণনা করার দরকার নেই বলে ধরে নেওয়া, প্রয়োজন অনুসারে পৃথক বাইন্ডিংয়ের জন্য সরাসরি HTML মার্কআপে। এখানে একটি উদাহরণ:
{{(data.input/data.input2)| number}}
এই ক্ষেত্রে আপনি কেবল () তে গণিত করুন এবং তারপরে একটি ফিল্টার ব্যবহার করুন একটি নম্বর উত্তর পেতে। পাঠ্য হিসাবে কৌণিক সংখ্যা ফরম্যাটে আরও তথ্য এখানে:
হয় স্কোলে গ্লোবাল ম্যাথ অবজেক্টটি বেঁধে রাখুন (উইন্ডো নয় উইন্ডোটি ব্যবহার করার কথা মনে রাখবেন)
$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>
এটি করার মতো খুব কৌণিক উপায়ে লাগে না। এটি কেন কাজ করে না তা আমি পুরোপুরি নিশ্চিত নই, তবে এর মতো কোনও ফাংশনটি ব্যবহার করার জন্য আপনাকে সম্ভবত সুযোগটি অ্যাক্সেস করতে হবে।
আমার পরামর্শ হ'ল একটি ফিল্টার তৈরি করা। এটি কৌণিক উপায়।
myModule.filter('ceil', function() {
return function(input) {
return Math.ceil(input);
};
});
তারপরে আপনার এইচটিএমএলে এটি করুন:
<p>The percentage is {{ (100*count/total) | ceil }}%</p>
number
ফিল্টার সহস্র বিভাজক সঙ্গে সংখ্যা বিন্যাস, তাই এটি কঠোরভাবে একটি গণিত ফাংশন নয়।
তদুপরি, এর দশমিক 'সীমাবদ্ধ' ceil
কোনও কাটা দশমিক নয় (যেমন কিছু অন্যান্য উত্তর আপনাকে বিশ্বাসের দিকে পরিচালিত করবে), বরং round
সেগুলি যুক্ত করে।
সুতরাং আপনার যে কোনও গণিতের ক্রিয়াকলাপের জন্য, আপনি এটির মতো করে করতে পারেন (পুরো ম্যাথ অবজেক্টটি ইনজেকশন দেওয়ার চেয়ে বিদ্রূপ করা সহজ):
myModule.filter('ceil', function () {
return Math.ceil;
});
এটি অন্য ফাংশনে মোড়ানোর দরকার নেই।
এটি কম-বেশি তিনটি উত্তরের সংক্ষিপ্তসার (সারা ইনস ক্যাল্ডারন, ক্লেক্সন এবং গোথবার্জ দ্বারা), তবে তারা সবাই গুরুত্বপূর্ণ কিছু যুক্ত করেছে, আমি সমাধানগুলিতে যোগ দেওয়া এবং আরও কিছু ব্যাখ্যা যুক্ত করার বিষয়টি বিবেচনা করি।
আপনার উদাহরণ বিবেচনা করে, আপনি আপনার টেম্পলেটটিতে গণনাগুলি ব্যবহার করে করতে পারেন:
{{ 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)}}
) নীচের স্তরে ফ্যালব্যাকগুলি সংজ্ঞায়িত ফ্যালব্যাকগুলির সাথে আরও সুনির্দিষ্ট হতে পারবেন । যদিও, এটি সর্বদা বুদ্ধিমান নাও হতে পারে ..
কৌণিক টাইপস্ক্রিপ্ট উদাহরণ পাইপ ব্যবহার করে।
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'}}
<p>The percentage is {{(100*count/total)| number:0}}%</p>
নীচের মন্তব্যে আরও কিছু।