В директиве 1-го и 2-го порядка находится область действия контроллера и наборы данных контроллера, переданные в директивы в качестве атрибутов. В 1-м примере директива может изменять данные контроллера. Во втором примере директива использует данные контроллеров как строки и создает 2 объекта 'productsObj' и 'salesObj' и не может изменять область родителя. Это зависит от того, как вы обрабатываете атрибуты в директиве и как их переносить в нее. Просто нажмите на элементы в разделе «Список продуктов (директивы)», и вы увидите результат.
первый: http://plnkr.co/edit/v46oEGHvUnxMNYsKAeaW?p=preview
var directive = function() {
return {
restrict: 'E',
replace: true,
templateUrl: 'directive-template.html',
scope: {
products: '=',
sales: '='
}
};
};
HTML:
<div ng-controller="BusinessController as BusinessCtrl">
<sale-prod products="BusinessCtrl.products" sales="BusinessCtrl.sales"></sale-prod>
</div>
второй: http://plnkr.co/edit/7CyIsqBNLbeZjyfbkGo9?p=preview
var directive = function() {
return {
restrict: 'E',
replace: true,
templateUrl: 'directive-template.html',
scope: {
products: '@',
sales: '@'
},
link: function(scope, element, attrs) {
attrs.$observe('products', function(newVal) {
scope.productsObj = angular.fromJson(newVal);
});
attrs.$observe('sales', function(newVal) {
scope.salesObj = angular.fromJson(newVal);
});
}
};
};
HTML:
<div ng-controller="BusinessController as BusinessCtrl">
<sale-prod products="{{BusinessCtrl.products}}" sales="{{BusinessCtrl.sales}}"></sale-prod>
</div>
3-й пример - это всего лишь фрагмент кода, в котором показано, как ввести службу в директиву и контроллер. Я добавляю, потому что в вас, например я не видел инъекции службы в директиве:
(function(undefined) {
var app = angular.module('prodsChart', []);
var controller = function($scope, Business, Products) {
// controller logic
};
var directive = function(Business) {
return {
restrict: 'E',
link: function(scope, element, attrs) {
// here you can use all Business service logic
}
};
};
var serviceBusiness = function() {
// business service logic
};
var serviceProducts = function() {
// products service logic
};
app.controller('BusinessController', ['$scope', 'Business', 'Products', controller])
.directive('saleProd', ['Business', directive])
.service('Business', serviceBusiness)
.service('Products', serviceProducts);
})();
HTML:
<div ng-controller="BusinessController as BusinessCtrl"></div>
<sale-prod></sale-prod>
Более предпочтительным является использование общей службы между контроллерами и директивами – IvanMalenko
@IvanMalenko Я обновил мой Вопрос: должен ли я так поступать? Но тогда, как мне получить доступ к 2 наборам данных в Директиве? Прежде чем я использовал изолированную область действия, но на самом деле не нуждался в ней, так как мне не нужна двусторонняя привязка данных. – adnpwd
Не уверен, правильно ли я понял вопрос, но мне кажется, что вы можете создать 2 разных объекта для хранения данных и затем привязать эти объекты к области видимости. 'Сфера.dataObject1 = {someData: firstData, moreData: secondData} '. Вы можете создать столько объектов, сколько хотите. – BobDoleForPresident