Как получить значение из директивы в моем случае

#javascript #html #angularjs

#javascript #HTML #angularjs

Вопрос:

Я пытаюсь создать директиву для моего приложения в Angular и мне нужно передать значение моему контроллеру

У меня есть что-то вроде

 controllers.directive('checkBox', function() {
    return {
        restrict: 'E',
        scope: {
            checkAll: '=',
        },
        template: '<input check-all="checkAll" type="checkbox" ng-model="check"/>',
        replace: true,
        link: function(scope) {
            scope.$watch('checkAll', function(newVal){
                scope.check = newVal;
            })
        }
    }
})

app.controller('test', function(){
    $scope.submit=function(){
    //not sure how to get the checkbox value as $scope.check is undefined....        
    }
})
  

HTML

 <div ng-controller="test">
 <div class="checkbox" ng-repeat="item in items">
      <check-box></check-box>{{item.name}}
 </div>
  <button type="button" ng-click="submit()">submit</button
</div>
  

Комментарии:

1. Что именно должна делать эта директива? Я хотел бы помочь, но мне нужно больше информации об ожидаемом поведении.

2. директива может проверить, установлен ли флажок «проверить все», и установит все флажки.

3. Я не вижу, чтобы вы использовали checkAll где-либо. Кажется, вы устанавливаете, <input check-all="checkAll" но это не будет использовать checkAll переменную scope, просто используйте ее как строковое значение для check-all атрибута.

Ответ №1:

Вы используете двустороннюю привязку с использованием = for checkAll .

 scope: {
    checkAll: '=',
}
  

Вот как вы это делаете. По сути, ваша директива будет иметь check-all атрибут и любую $scope переменную, которую вы передадите ей из представления контроллера, вы можете изменить эту переменную внутри директивы, и значение будет отражено обратно в контроллере.

Итак, допустим, у вашего контроллера есть переменная области видимости с именем testValue . Затем вы можете использовать его в разметке следующим образом:

 <div class="checkbox" ng-repeat="item in items">
    <check-box check-all="testValue"></check-box>{{item.name}}
</div>
  

И теперь все, что директива делает с checkAll функцией link директивы, будет отражено в функции вашего контроллера $scope.testValue .

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

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

ОБНОВЛЕНО:

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

 controllers.directive('checkBox', function() {
    return {
        restrict: 'E',
        scope: {
            ngModel: '=',
            checkAll: '='
        },
        template: '<input check-all="checkAll" type="checkbox" ng-model="ngModel"/>',
        replace: true,
        link: function(scope) {
            scope.$watch('checkAll', function(newVal){
                scope.check = newVal;
            })
        }
    }
})

app.controller('test', function(){
    $scope.submit=function(){
      console.log($scope.checkboxVariable);
      // or use $http service to send the value
    }
})
  

HTML

 <div ng-controller="test">
  <div class="checkbox" ng-repeat="item in items">
    <check-box ng-model="checkboxVariable"></check-box>{{item.name}}
  </div>
  <button type="button" ng-click="submit()">submit</button
</div>
  

Позвольте мне немного объяснить это.

Я думаю, что вы хотите, чтобы ваша директива заменяла элемент ввода checkbox. И когда это проверяется, тогда что-то в области видимости должно быть установлено. Директива не может ничего устанавливать, если ей не разрешено устанавливать значение в области контроллера. Этого вы можете достичь, используя двойную привязку с помощью = настройки. Итак, мы определили новый атрибут scope, вызываемый ngModel с двойной привязкой. И в разметке мы передаем ему переменную области видимости с именем check . Теперь, когда флажок ввода установлен / снят, область действия директивы получает свое значение из ngModel переменной своей собственной области. И поскольку ngModel имеет двойную привязку к нему, это отражается в check переменной контроллера.

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

Комментарии:

1. спасибо за помощь. Я все еще не уверен в том, как получить доступ к установленным флажкам в моей функции отправки. не могли бы вы, пожалуйста, поместить некоторые коды внутрь функции? Спасибо. !

2. Пожалуйста, проверьте ответ еще раз. Проверьте ng-model в HTML и вашей submit() функции.