क्या 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
) हर पाचन पर मूल्यांकन करना होगा , क्योंकि कोणीय में यह जानने का कोई तरीका नहीं है कि क्या मूल्य बदल गया है या नहीं जैसा कि यह एक संपत्ति के साथ होगा। दायरे पर।
ऐसा करने का "कोणीय" तरीका यह होगा कि आप किसी प्रॉपर्टी की वैल्यू को किसी चेंज-ऑन इवेंट या किसी $ घड़ी के इस्तेमाल से बदल सकते हैं।
एक स्थिर रूप के साथ उदाहरण के लिए:
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]);
और उपयोग करने के लिए:
{{नंबर_वर | गणित: 'प्लस्तर लगाना'}}
यदि आप कोणीय में एक सरल दौर कर रहे हैं, तो आप आसानी से अपनी अभिव्यक्ति के अंदर फ़िल्टर सेट कर सकते हैं। उदाहरण के लिए:
{{ val | number:0 }}
इस CodePen उदाहरण और अन्य नंबर फ़िल्टर विकल्पों के लिए देखें।
कोणीय के साथ सरल गणित करने का सबसे आसान तरीका है कि आप अपने पेज पर बड़े पैमाने पर गणना करने की आवश्यकता नहीं है, यह मानते हुए कि सीधे अलग-अलग बाइंडिंग के लिए 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));
};
});
अपने HTML में फ़िल्टर का उपयोग करें:
<p>Distance from zero: {{distance | abs}}</p>
यह ऐसा करने का एक बहुत कोणीय तरीका नहीं दिखता है। मुझे पूरी तरह से यकीन नहीं है कि यह क्यों काम नहीं करता है, लेकिन आपको इस तरह के फ़ंक्शन का उपयोग करने के लिए गुंजाइश की आवश्यकता होगी।
मेरा सुझाव एक फिल्टर बनाना होगा। वह है कोणीय तरीका।
myModule.filter('ceil', function() {
return function(input) {
return Math.ceil(input);
};
});
फिर अपने HTML में ऐसा करें:
<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 घोषणाओं में जोड़ें
@NgModule({
declarations: [
MathPipe,
फिर अपने टेम्पलेट में उपयोग करें जैसे:
{{(100*count/total) | math:'round'}}
<p>The percentage is {{(100*count/total)| number:0}}%</p>
नीचे टिप्पणी में अधिक।