Как изменить функции выбора в директиве Angular?

http://plnkr.co/edit/pJRzKn2v1s865w5WZBkR?p=preview

У меня есть большая выпадающая форма выбора, которая повторяется в 2 местах. Единственное, что изменилось, — это первый тег выбора, у которого другая функция.

<!--
  On simple, change ng-change function to functionOne
  On advanced, change ng-change function to functionTwo
-->

<select name="name1" ng-change="functionOne('function1')" id="the-id-1">
<select name="name2" ng-change="functionTwo('function2)" id="the-id-2">
  <option value="aaa">aaa</option>
  <option value="bbb">bbb</option>
  <option value="ccc">ccc</option>
</select>

I tried using ng-hide ng-show however there must be a different way to accomplish this.

var app = angular.module('myApp', [])

.directive('termsForm', function() {
    return {
        templateUrl : "termsForm.html",
        restrict    : "E",
        scope       : false,
        controller  : 'TermsFormController'
    }
})

.directive('selectOptions', function() {
    return {
        templateUrl : "form.html",
        restrict    : "E",
        scope       : false
    }
})

.controller('TermsFormController',
['$scope',
function($scope) {
    var vs = $scope;
    vs.hello = "This is the form.";
    vs.showingSimple = true;
    vs.showingAdvanced = false;

    vs.showForm = function(type) {
      if (type === 'simple') {
        vs.showingSimple = true;
        vs.showingAdvanced = false;
      } else if (type === 'advanced') {
        vs.showingSimple = false;
        vs.showingAdvanced = true;
      }
    }

    vs.functionOne = function(msg) {
      alert(msg);
    }

    vs.functionTwo = function(msg) {
      alert(msg);
    }
}]);

termsForm.html

<ul class="nav nav-tabs">
  <button class="btn btn-info" ng-click="showForm('simple')">Simple</button>
  <button class="btn btn-info" ng-click="showForm('advanced')">Advanced</button>
</ul>

<p>The select:</p>

<div ng-show="showingSimple" class="simple-form">
  <p>Simple</p>
  <select-options></select-options>
</div>

<div ng-show="showingAdvanced" class="advanced-form">
  <p>Advanced</p>
  <select-options></select-options>
</div>

person Leon Gaban    schedule 30.03.2015    source источник


Ответы (2)


У вас уже есть директива, созданная для вашего выбора, которая поможет вам на полпути. Теперь вам просто нужно передать функцию через так называемую изолированную область.

.directive('selectOptions', function() {
    return {
        templateUrl : "form.html",
        restrict    : "E",
        scope       : {
          changeFunc: '&'
        }
    }
})

Это позволяет вам передать функцию, которую вы хотите вызвать в событии ng-change:

<select-options changeFunc="function1"></select-options>
<select-options changeFunc="function2"></select-options>

И затем в вашем form.html вы просто помещаете

<select name="name2" ng-change="changeFunc()" id="the-id-2">

Таким образом, вы в основном передаете функцию в качестве параметра. Прочтите этот блог, чтобы получить отличное руководство. на изолированных прицелах.

person David says Reinstate Monica    schedule 30.03.2015
comment
Спасибо! Я полагаю, это также можно использовать для изменения ng-модели? - person Leon Gaban; 30.03.2015
comment
Да, но вы должны использовать правильный тип привязки (@). Прочтите этот блог для получения дополнительной информации. - person David says Reinstate Monica; 30.03.2015

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

В вашем контроллере вы сначала выставите «общую» функцию изменения для раскрывающегося списка...

(function () {
    'use strict';

    angular.module('app').controller('someCtrl', [someCtrl]);

    function someCtrl() {
        var vm = this;
        vm.isSimple = true;
        vm.nameChange = function () {
            if(vm.isSimple)
                functionOne('function1');
            else
                functionTwo('function2');
        }

        // Other things go here.
    }
})();

... Затем, на ваш взгляд, ваш выбор изменится на это *:

<select id="someId" name="someName" ng-change="vm.nameChange()" />

*: Предполагая, что вы используете синтаксис controllerAs, т.е. Если нет, не ставьте vm. перед select.

person Andrew Gray    schedule 30.03.2015