После того, как вы прочтете комментарии, я сделаю это: используйте объект, чтобы сохранить все ваше состояние и передать его обеим директивам. Demo plunker
HTML
<body ng-controller="MySearchController">
<search-box search="mySearch"></search-box>
<search-results search="mySearch"></search-results>
</body>
JS
var search = angular.module('search', []);
//simulated service
search.service('Search', ['$timeout', '$q', function($timeout, $q) {
return {
findByQuery : function(query) {
var deferred = $q.defer();
$timeout(function() {
deferred.resolve([query + ' result1', query + ' result2']);
console.log('resolved query ' + query);
}, 2000);
return deferred.promise;
}
};
}]);
search.controller('MySearchController', ['$scope', function($scope) {
$scope.mySearch = {
query : ''
}
}]);
search.controller('SearchBoxCtrl', ['$scope', 'Search', function($scope, Search) {
$scope.execute = function(search) {
console.log(search);
if(search.query && search.query.length > 3 && !search.running) {
search.running = true;
search.promise = Search.findByQuery(search.query).then(function(val) {
search.results = val;
});
}
};
}]);
search.directive('searchBox', function(){
return {
restrict: 'E',
scope : {
search : '='
},
controller: 'SearchBoxCtrl',
template : '<div ng-hide="search.results">Query: <input type="text" ng-model="search.query" ng-disabled="search.running"></input> <button ng-click="execute(search)" ng-disabled="search.running">Search</button></div>',
replace: 'true'
};
});
search.controller('SearchResultsCtrl', function(){
});
search.directive('searchResults', function(){
return {
restrict: 'E',
scope : {
search : '='
},
controller: 'SearchResultsCtrl',
template : '<div ng-show="search.results"><div ng-repeat="result in search.results">{{result}}</div></div>',
replace: true,
link : function(scope, element, attrs, ctrl){
}
};
});
PS:
- Не используйте теги p в шаблонах директив в качестве корневого узла. Парсер html сообщает 2 узла, если у вас есть p дочерних узлов, а угловой - для одного корневого узла.
- Вы можете дополнительно использовать обещание в контроллере зарегистрировать другие функции для выполнения, когда результаты приходят в
Посмотрите на 'siblingDirectiveName' в руководстве для разработчиков директив HTTP:. //docs.angularjs. org/guide/directive, помогает ли это – Chandermani
@Chandermani Нет, это касается директив в одном элементе (т. е. директивы сиблинга не являются директивами в элементах брата). –
не могли бы вы опубликовать скрипку демонстрации plunker, пожалуйста, –