Как использовать один контроллер для нескольких входов с одинаковой логикой?

У меня есть следующий сценарий: одна форма с несколькими входами, и мне нужно вычислить каждый вход одинаково, но вернуть значения в разные поля.

<div class="row">
        <input type="number" min="1" class="form-control" id="InputValorFOR" placeholder="" ng-change="findModifier()" ng-model="atrb.for">
        <p>{{mod.for}}</p>
</div>
<div class="row">
        <input type="number" min="1" class="form-control" id="InputValorDES" placeholder="" ng-change="findModifier()" ng-model="atrb.des">
        <p>{{mod.des}}</p>
</div>

контроллер:

app.controller('atributosCtrl', function($scope){

findModifier = function() {        
    if ($scope.atrb > 1 && $scope.atrb <10)
    {
        if ($scope.atrb % 2 == 0)
        {
            $scope.mod = (($scope.atrb / 2) - 5);
        }        
    }
};    
$scope.$watch('atrb', findModifier); });

Я хочу изменить значение mod.for или mod.des без необходимости писать контроллер для каждого входа. но я не знаю, как передать имя модели из ввода, который я изменяю


person saulo china    schedule 12.07.2016    source источник
comment
почему бы не использовать ng-change="findModifier(<string>)"   -  person batmaniac7    schedule 12.07.2016
comment
не знал, что я могу это сделать, ткс! Ответ Валдира с plnkr помог мне понять, как туда добраться   -  person saulo china    schedule 13.07.2016


Ответы (2)


Я не знаю, что именно вы хотите, но я внес некоторые изменения в ваш код, чтобы он работал. Пожалуйста, скажите мне, что вы хотите в комментариях здесь, и я могу помочь вам.

Ваш HTML изменен:

  <body ng-controller="atributosCtrl">
    <div class="row">
        <input type="number" min="1" class="form-control" id="InputValorFOR" placeholder="" ng-change="findModifier('for')" ng-model="atrb.for">
        <p>{{mod.for}}</p>
    </div>
    <div class="row">
        <input type="number" min="1" class="form-control" id="InputValorDES" placeholder="" ng-change="findModifier('des')" ng-model="atrb.des">
        <p>{{mod.des}}</p>
    </div>
  </body>

Ваш JS изменен:

app.controller('atributosCtrl', function($scope){
  $scope.atrb = {
    for: null,
    des: null
  };
  $scope.mod = {
    for: null,
    des: null
  };

  $scope.findModifier = function(type) {
    $scope.mod[type] = null;
    if ($scope.atrb[type] > 1 && $scope.atrb[type] <10)
    {
        if ($scope.atrb[type] % 2 === 0)
        {
            $scope.mod[type] = (($scope.atrb[type] / 2) - 5);
        }        
    }
  }
});

Планкер: https://plnkr.co/edit/aCNJQyfYXZ5vU1rc381S

person Waldir J. Pereira Junior    schedule 12.07.2016

Думаю, вы ожидаете чего-то подобного. Вы можете написать пользовательскую директиву с функцией ссылки, как показано ниже.

(function () {
    "use strict";
    angular.module("app").directive("notifypropertychanged", notifypropertychanged);
    function notifypropertychanged() {
        var directive = {
            require: "ngModel",
            link: function ($scope, element, attrs, ngModel) {
                $scope.$watch(attrs["notifypropertychanged"], function (newVal, oldVal) {

                    var initialValue = attrs["oldvalue"];

                });
            }
        };
        return directive;
    }
})();

Примените эту директиву к вашему вводу

 <input type="number" min="1" class="form-control" notifypropertychanged="atrb.des"  oldvalue=" {{::atrb.des}} " id="InputValorDES" placeholder="" ng-model="atrb.des"> 

всякий раз, когда значение изменяется, оно попадает на пользовательские часы.

надеюсь, это поможет

person Code-EZ    schedule 12.07.2016
comment
это правильный и хороший ответ, чтобы использовать директиву и часы, но я выбираю ответ Валдира, потому что это было проще и проще решить проблему, спасибо - person saulo china; 13.07.2016