2016-11-22 1 views
0

Я объясню, что именно я пытаюсь сделать, прежде чем объяснять проблему. У меня есть Директива, которая содержит форму, и мне нужно получить доступ к этой форме из родительского элемента (где используется Директива) при нажатии кнопки отправки, чтобы проверить, что форма действительна.

Для этого я пытаюсь использовать $scope.$parent[$attrs.directiveName] = this;, а затем привязывая некоторые методы к Директиве, такие как this.isValid, которые будут отображаться и исполняться в родительском.

Это нормально работает при запуске локально, но когда вы меняете и создаете мой код (Yeoman angular-fullstack), я получаю сообщение об ошибке aProvider, о котором я проследил до ошибки $scopeProvider в контроллере.

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

Является ли что-то очевидным, что я делаю неправильно?

Любая помощь приветствуется.

(function() { 
    'use strict'; 

    angular 
    .module('myApp') 
    .directive('formDirective', formDirective); 

    function formDirective() { 
     var directive = { 
     templateUrl: 'path/to/template.html', 
     restrict: 'EA', 
     scope: { 
      user: '=' 
     }, 
     controller: controller 
     }; 

     return directive; 

     controller.$inject = ['$scope', '$attrs', 'myService']; 
     function controller($scope, $attrs, myService) { 
     $scope.myService = myService; 

     // Exposes the Directive Controller on the parent Scope with name Directive's name 
     $scope.$parent[$attrs.directiveName] = this; 

     this.isValid = function() { 
      return $scope.myForm.$valid; 
     }; 

     this.setDirty = function() { 
      Object.keys($scope.myForm).forEach(function(key) { 
      if (!key.match(/\$/)) { 
       $scope.myForm[key].$setDirty(); 
       $scope.myForm[key].$setTouched(); 
      } 
      }); 

      $scope.myForm.$setDirty(); 
     }; 
     } 

    } 
})(); 
+1

Я бы посмотрел на переход от директивы к компоненту https://docs.angularjs.org/guide/component. Затем используйте идею входов и выходов для связи с родительским контейнером и компонентом. То, что вы делаете, - это не правильный способ сделать это. – Stevo

+0

Jeez, не понимал, что '.component' был добавлен в Angular 1.x. Некоторая помощь в преобразовании этой существующей логики в компонент была бы весьма признательна. – germainelol

ответ

0

Изменить директиву на компонент и реализовать четкий интерфейс.

Parent Container (parent.html):

<form-component some-input="importantInfo" on-update="someFunction(data)">  
</form-component> 

контроллер Родитель (parent.js):

//... 

$scope.importantInfo = {data: 'data...'}; 
$scope.someFunction = function (data) { 
    //do stuff with the data 
} 

//.. 

form-component.js:

angular.module('app') 
.component('formComponent', { 
    template:'<template-etc>', 
    controller: Controller, 
    controllerAs: 'ctrl', 
    bindings: { 
    onUpdate: '&', 
    someInput: '<' 
    } 
}); 

function Controller() { 

    var ctrl = this; 
    ctrl.someFormThing = function (value) { 
    ctrl.onUpdate({data: value}) 
} 

} 

Так что, если событие в вашей форме вызывает функцию ctrl.someFormThing(data) , Это можно передать до родителя, вызвав ctrl.onUpdate().

+0

Как бы вы справились с ситуацией, когда вы не хотите вручную запускать вызов 'onUpdate'? В моем случае у меня есть форма, и мне нужно знать от родителя, если эта форма действительна или нет. В настоящее время у меня есть метод isValid, который возвращает 'form. $ Valid', поэтому используя синтаксис Component, как я могу получить доступ к этому из родителя? – germainelol

+0

Просто, чтобы быть ясным. Родитель содержит дочернюю директиву, содержащую форму. Родитель должен быть проинформирован о состоянии формы при ее изменении? Или родитель должен «запрашивать» состояние формы? В любом случае вы должны использовать onUpdate. Таким образом, у вас может быть $ watch on form. $ Valid и call onUpdate, если он изменится. Затем в вашем родителе функция, называемая объектом, изменяет локальное состояние родительской формы. Вы знаете, что если хотите, у вас может быть двухсторонняя привязка свойства. Но это не рекомендуется. Прочтите документы компонентов. – Stevo

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