我已经在角度创建了一个用于执行简单计算器的应用程序。
应用程序工作正常(demo)但是在计算方法的控制器中我已经在javascript中编写了一些算术计算。因此,为了使我的角度代码清洁,我创建了另一个名为common.js的文件,其中我放置了算术计算。我使用的是lodash.js。但当我试图调用方法_.calculateResult($scope.firstNumber, $scope.secondNumber, $scope.selectedOperator );
时,我得到以下异常。
TypeError: Object function lodash(value) {
// don't wrap if already wrapped, even if wrapped by a different `lodash` constructor
return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))
? ...<omitted>... } has no method 'calculateResult'
at Object.$scope.calculate (http://localhost:8080/RestSample/app/scripts/controllers.js:18:19)
任何人都可以告诉我一些解决方案。
common.js
(function() {
var calculateResult = function(no1, no2, opp) {
var A = parseInt(no1);
var B = parseInt(no2);
var C = 0;
switch (opp) {
case '+':
C = A + B;
break;
case '-':
C = A - B;
break;
case '*':
C = A * B;
break;
case '/':
C = A / B;
break;
}
return C;
}
})();
controllers.js
var app = angular.module('app', []);
app.controller("appController", function($scope){
$scope.operators = ['+', '-', '*', '/'];
$scope.selectedOperator = $scope.operators[0];
$scope.calculate = function() {
$scope.result = _.calculateResult($scope.firstNumber, $scope.secondNumber, $scope.selectedOperator );
};
});
的index.html
<div ng-app="app">
<div ng-controller="appController">
<div class="offset4 span6 well">
<label>Enter a value :</label>
<input ng-model="firstNumber" type="text"> <br/><br>
<label>Another Value:</label>
<input ng-model="secondNumber" type="text"> <br/><br>
<label>Operator:</label>
<select ng-model="selectedOperator"
ng-options="operator for operator in operators"></select>
<br><br>
<button ng-click="calculate()">Calculate</button> <br><br>
Result: {{result}}
</div>
</div>
</div>
答案 0 :(得分:3)
尝试ngLodash模块,像使用任何Angular模块/插件一样启动它。它可以在不触及窗口范围的情况下完成工作,并保持正常的Angular加载方式。
https://github.com/rockabox/ng-lodash
它也在凉亭上
Bower安装nglodash
使用脚本标记将其添加到html文件中,然后将其加载到模块中。
答案 1 :(得分:1)
为什么要起作用?
使用lodash时,_
符号通常绑定到lodash,因此您使用以下代码在lodash库上调用方法:
_.calculateResult($scope.firstNumber, $scope.secondNumber, $scope.selectedOperator );
确实错误消息确认_
是lodash。
此外,您的common.js
文件永远不会将calculateResult
导出到匿名函数之外的代码可访问的某个位置。如果您在匿名函数window
的末尾添加此语句,则可以在window.calculateResult = calculateResult
上将其导出,然后您将其调用:
window.calculateResult($scope.firstNumber, $scope.secondNumber, $scope.selectedOperator );
这应该照顾你当前的问题。 (window
在window.calculateResult(...)
中实际上是可选的,因为如果没有它,JavaScript解释器仍然会从全局范围中寻找calculateResult
,但我更愿意将其明确化。)
我强烈建议调查一个合适的模块化系统,以避免使用calculateResult
等函数污染全局范围。