Связь с директивой Angular Js, определяющая, включена ли в области действия другая директива

Я знаю, что есть способ заставить директивы общаться друг с другом. Вы можете сделать это с помощью контроллеров. Моя проблема в том, что у меня есть 2 директивы на странице, я создаю приложение для загрузки, я использую директиву изменения файла, которая определяет, использовался ли ввод файла для выбора файла, и директиву, которая создает зону перетаскивания для перетаскивания файлы оба рабочие.

Но как мне заставить приложение определить, используется ли на странице директива dropzone или filechange? Я создал фабричный метод и использую службу данных с массивом, чтобы вставлять имена директив в массив. но когда это происходит, хотя оба находятся на странице, регистрируется только один? Как это исправить? это асинхронная проблема?

вот мой uploader3.js

var app = angular.module("uploader", []);
app.factory('data', function(){

return {

    directives:[],
    progressBarSet:false,
    getData:function(){

        return this;

    }

   }

});


app.directive("dropzone", ["data", function (data) {

return {

    restrict: "A",
    controller: function($scope){

    },
    priority: 0,
    link: function (scope, element, attr, ctrl) {

         data.directives.push("dropzone");            
         console.log(data.directives);
    }

  }

}]);




app.directive("filechange", ["data", function (data) {

return {

    restrict: "A",
    controller: function($scope){

    },
    priority: 1,
    link: function (scope, element, attr, ctrl) {

         data.directives.push("filechange");            
         console.log(data.directives);
    }

  }

}]);

вот мой хтмл.

<!doctype html>
<html ng-app="uploader">
<script src="Scripts/angular.min.js"></script>
<script src="app/uploader3.js"></script>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body dropzone>
    <input type="file" name="FILEDATA" id="FILEDATA" accept="image/jpg, image/jpeg" filechange>
</body>
</html>

Когда я регистрирую data.directives, он показывает, что его длина равна 1? как мне применить push и получить обе директивы для регистрации в моей службе данных?

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


person Jesse    schedule 15.10.2013    source источник


Ответы (3)


Видя, что вам нужен индикатор выполнения, одним из вариантов может быть создание отдельной директивы progressBar, которая необязательно требует (?^) dropzone и filechange.

Если вы пойдете по этому пути, вот что-то, что обсуждает связь в этой ситуации: контроллеры родительских директив?

и при нескольких требованиях: https://groups.google.com/forum/#!msg/angular/PZLxEKZUy5k/M1_JKF84-MEJ

Это может дать вам хорошее разделение обязанностей, если это имеет смысл в вашей архитектуре.

Если вы этого не сделали, вы также можете проверить эту реализацию, которая не решает ваш вопрос, но может быть полезна внутри директивы progressBar: http://victorbjelkholm.github.io/ngProgress/

person KayakDave    schedule 15.10.2013

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

Попробуй это:

    var app = angular.module("uploader", []);
    app.factory('data', function(){

    var directives = [];

    return {
    directives: function() {
        return directives;
    },
    progressBarSet:false,
    getData:function(){

        return this;

    }

   }

});
person B Cotter    schedule 15.10.2013
comment
Я попробую это посмотреть, если это работает. моя директива изменения файла регистрируется, а директива dropzone - нет. Я не уверен, почему это происходит, но когда вы углубляетесь в веб-инспектор, оба они регистрируются в var, когда вы пытаетесь сослаться на него, а это не так? Это проблема масштаба? - person Jesse; 16.10.2013

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

person ValPar    schedule 15.10.2013
comment
Мне нужно, чтобы они работали независимо друг от друга. Я стараюсь сделать их как можно более модульными. Причина обнаружения в том, что мне нужно добавить индикатор выполнения, но ограничить его одним, если я этого не сделаю, тогда у меня будет несколько на странице. Таким образом, в основном, если директива существует, проверьте, существует ли другая директива на странице, поэтому к странице применяется только один индикатор выполнения. - person Jesse; 15.10.2013
comment
Я также попытался подключить $scope.directives к контроллеру, и это тоже не сработало по какой-то причине, когда вы регистрируете переменную, она показывает длину 1 - person Jesse; 15.10.2013
comment
Я думаю, что это проблема с директивой, может быть, я попытался изменить переменные, которые регистрирует переменная данных изменения файла, но не в зоне сброса, может быть, это проблема с последовательностью, например, переменная не устанавливается к тому времени, когда я пытаюсь ссылаться на нее? Я вышел из системы, изменение файла службы данных есть, но dropzone нет - person Jesse; 16.10.2013