0

У меня есть TimelineController, который имеет функцию publish в области, которая будет отправлять некоторые данные на сервер.trigger Controller scope from directive AngularJs

Мой график состоит из 2 directives

  • сроков (Element)
  • разделённого поста (Element)

Я хотел бы иметь возможность звонить из share-post директивы publish функция на моем TimelineController возможно ?.

Контроллер

function TimelineController($scope,TimelineService) 
    { 
     $scope.posts = []; 

     $scope.publish = function(wall_type,wall_id,text,video,image) { 
      console.log('click controller'); 
      TimelineService.publishPost(wall_type,wall_id,text,video,image).$promise.then(function(result){ 
       $scope.posts.push(result.response); 
      }); 
     }; 
    } 

Временная шкала Директива:

function timelineDirective() { 

     return { 
      restrict: 'E', 
      replace: true, 
      scope: { 
       type: '@', 
       ids: '@', 
       postime: '&', 
       posts: '=' 
      }, 
      templateUrl:"/js/templates/timeline/post-tmpl.html", 
      controller: function($scope,$element) { 

       this.type = $element.attr('type'); 
       this.ids = $element.attr('ids'); 
      } 
     } 
    }; 

Временная шкала Директива Шаблон

<ol class="timeline" ng-init="postime({wall_type:type,wall_id:ids})"> 
    <li> 
     <share-post></share-post> 
    </li> 
    <li ng-repeat="post in posts"> 
     {{post.text}} 
    </li> 
</ol> 

SharePost Директива: Из этой директивы я хотел бы назвать публикацию на TimelineController

function sharePost() { 

     return { 
      restrict: 'E', 
      replace: true, 
      require: "^timeline", 
      templateUrl:"/js/templates/timeline/share-tmpl.html", 
      link: function($scope,$element,$attr,ctrl) { 
       $scope.pub = function() { 

        // This does not work because it call the parent directive 
        // Instead of controller 
        $scope.publish(ctrl.type, ctrl.ids, $scope.text); 
       } 
      } 
     } 
    }; 

Sharepost Директива Шаблон

<div class="module comment"> 
    <div class="content"> 
     <textarea class="form-control" ng-model="text" placeholder="What is going on..." rows="2"></textarea> 
    </div> 

    <button type="button" class="btn" ng-click="pub()"> Share</button> 

</div> 
+0

Я думаю, вы должны либо ввести службу TimelineService непосредственно в свою директиву, либо в ject «публикация» функции в область вашей директивы с использованием атрибутов – Neozaru

+0

Я бы хотел, чтобы не вводить службу в директиву – Fabrizio

+0

@Fabrizio, позвольте мне прямо понять, хотите ли вы запустить событие click на контроллере из директивы ? –

ответ

0

Измените директиву, чтобы иметь дополнительный пункт в рамках, как это onPublish: "@" то в вашем html вы можете передать указатель на функцию контроллера, которую вы хотите вызвать следующим образом:

<share-post on-publish="publish"></share-post> 

назвать это из директивы вы должны сделать:

$scope.onPublish()(ctrl.type, ctrl.ids, $scope.text) 
+0

Этот способ не работает, потому что как вы можете видеть директиву 'share-post', является дочерним элементом' timeline', если я передаю метод 'publish', как вы показали, что пытаетесь получить родительскую директиву' publish', я думаю. – Fabrizio

+0

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

+0

. Yhea, вы объяснили, что я говорю лучше, чем меня, неприятно перейти от родителя директива для дочерней директивы. Большое спасибо, можете ли вы показать небольшой пример того, как с помощью службы я могу установить связь, директиву и контроллер? – Fabrizio

1

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

angular.module('module').directive('sharePost', [ 
     function(){ 
      return { 
       link: function (scope, element, attr) { 
        var clickAction = attr.clickAction; 
        element.bind('click',function (event) { 
         scope.$eval(clickAction); 
        }); 
       } 
      }; 
    }]); 

HTML

<a sharePost click-action="publish(wall_type,wall_id,text,video,image)"> publish</a> 
+0

Спасибо за ваш ответ, кажется интересным, но я не понял, откуда эта функция появилась, эта функция означает функцию «publish» на контроллере? Спасибо – Fabrizio

+0

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

+1

Хорошо, теперь больше смысла, я попробую, чтобы это звучит хорошо для меня :) – Fabrizio