2015-09-17 2 views
0

Я создаю приложение для калькулятора в AngularJS, но у меня возникают проблемы с ng-repeat и ng-click.ng-click - Использование функций для значений свойств

<div class="col-md-3"> 
    <button ng-repeat="op in operations" name="btn{{ op.name }}" 
      value="{{ op.symbol }}" class="operationbutton" 
      ng-click="{{ op.function }}"> {{ op.symbol }} 
    </button> 
</div> 

В моих app.js, внутри моего контроллера, у меня есть операции переменных, привязанных к $scope.

$scope.operations = [ 
    { "symbol": "+", "name": "add", "function": "add()" }, 
    { "symbol": "-", "name": "subtract", "function": "subtract()" }, 
    { "symbol": "*", "name": "multiply", "function": "multiply()" }, 
    { "symbol": "/", "name": "divide", "function": "divide()" } 
]; 

Я попытался снять кавычки с имени функций, но оказывается, что значения объекта JavaScript должны содержать строки.

я мог бы сделать что-то вроде этого

ng-click="{{ op.name === 'add' ? add() : op.name === 'subtract' ? subtract() 
: op.name === 'multiply' ? multiply() : op.name === 'divide' ? divide() : multiply()}}" 

Но это кажется ужасной практикой. Есть ли способ улучшить это, поэтому я могу вызвать функцию, основанную на операции?

+1

Вы можете не назначать фактическую функцию 'op.function', а какой-то строковое выражение? –

+0

Создайте одну функцию с оператором switch для каждого символа, назначьте эту функцию ng-click (без символа). Наконец, чтобы заставить его работать, вам нужно создать другую переменную op_symbol или что-то подобное и использовать ее в вашем методе. Плюс я бы рекомендовал прочитать о синтаксисе bindToController/controllerAs. Это уменьшает использование $ scope в контроллере, потому что вы можете назначить vars, функции для этого функции контроллера - намного проще протестировать такой контроллер. – kornicameister

ответ

4

Наилучшим подходом является назначение реальной функции, а не строкового выражения вызова функции, каждому op:

function add(){ 
    // whatever you do now 
} 

// same for other functions 
function subtract(){} 
function multiply(){} 
function divide(){} 

$scope.operations = [ 
    { "symbol": "+", "name": "add", "function": add }, 
    { "symbol": "-", "name": "subtract", "function": subtract }, 
    { "symbol": "*", "name": "multiply", "function": multiply }, 
    { "symbol": "/", "name": "divide", "function": divide } 
]; 

И ng-click становится:

<button ng-repeat="op in operations" 
     ng-click="op.function()"> 
    {{ op.symbol }} 
</button> 
+1

Ударьте меня на ответ на 1 секунду. Вот демонстрация. http://jsbin.com/fiveduxeye/2/edit?html,js,output – m59

0
$scope.operations = [ 
    { "symbol": "+", "name": "add"}, 
    { "symbol": "-", "name": "subtract"}, 
    { "symbol": "*", "name": "multiply"}, 
    { "symbol": "/", "name": "divide"} 
]; 

<div class="col-md-3"> 
    <button ng-repeat="op in operations" name="btn{{ op.name }}" 
      value="{{ op.symbol }}" class="operationbutton" 
      ng-click="op.Operationfunction(op.name)"> {{ op.symbol }} 
    </button> 
</div> 

$scope.Operationfunction = function(operation){ 
switch(operation) 
case 'add': 
    add(); 
    break; 
case 'multiply': 
    multiply(); 
    break; 
.... 
}; 
1

Вы могли бы возможно, реорганизуйте свой код таким образом. Вы, контроллер, определяете, какие функции добавляются к объекту $ scope.

var add = function() { 
//code here 
}  

var subtract = function() { 
//coder her 
}  
$scope.operations= [ 
    { "name" : "add", "func" : add}, 
    { "name" : "subtract", "func" : subtract}, 
    ] 

В HTML вы могли бы сделать это ссылаться на их таким образом

<div class="col-md-3"> 
    <button ng-repeat="op in operations" ng-click="op.func()"> {{ op.symbol }} 
    </button> 
    </div> 
+1

Чтобы nitpick, не нужно устанавливать сами функции на '$ scope' –

+1

Спасибо! Я пробовал предмет области видимости, но забыл вызывать функции в 'ng-click'. У меня была 'op.function' вместо' op.function() ' –

+0

@NewDev вы правы. Я просто набрал его очень быстро. Спасибо за исправление. – inspired

Смежные вопросы