Я сделал директиву, используя сервис и $resource для поиска REST API и передачи результата контроллеру. Код выглядит следующим образом:
app.controller('productsCtrl', ['$scope', function ($scope) {
var self = this;
self.selection;
self.searched = function (selected) {
self.selection = selected;
};
}]);
app.service('productsService', ['productsResource', function (productsResource) {
var self = this;
self.findProducts = function (search) {
return productsResource.query({
sku: search
});
};
}]);
app.factory('productsResource', ['$resource', function ($resource) {
return $resource('products/:sku', {
id: '@sku'
});
}]);
app.directive('productSearch', ['productsService', function (productsService) {
return {
restrict: 'E',
scope: {
productSelected: '&'
},
templateUrl: '/products/product_search.html',
link: function (scope) {
scope.findProducts = function (search) {
scope.searchResults = productsService.findProducts(search);
};
scope.selectResult = function (selected) {
scope.selection = selected;
scope.showResults = false;
};
}
};
}]);
Соответствующие строки HTML:
<div ng-show='products.selection'>
{{products.selection.name}} //does not update
</div>
и из шаблона директив:
<div ng-click="productSelected({selected: selection})"></div>
Проблема в том, что моя модель не обновляется, когда директива вызывает метод контроллера (он покажет результаты последнего поиска). Для меня это имеет смысл, потому что там не вызывается никакая «угловая» функция. Но как я должен заставить это работать. Я пробовал с $scope.$apply()
, но это выдает ошибку.
Как побочный вопрос. Правильно ли я делаю это? Это угловой способ? Особенно с использованием службы внутри директивы и передачи вещей из директивы в контроллер?
РЕДАКТИРОВАТЬ: это весь файл HTML (с использованием controllerAs):
<div>
<product-search product-selected='products.searched(selected)'></product-search>
<div ng-show='products.selection'>
{{products.selection.name}}
</div>
</div>