从指令模板调用服务方法

时间:2014-09-05 12:20:14

标签: angularjs angularjs-directive angularjs-scope

我们说我有指令

<component>
   <img ng-src='{{something}}' />
</component>

定义为:

app.directive("component", function() {
    return {
        scope: {},
        restrict: 'E',
        transclude: true,
        template: "<a href='' ng-click='MyService.doThings()' ng-transclude></a>"
    }
});

尽管付出了很多努力,但我还是不明白如何完成两项任务:

  1. 如何访问内部图像源路径?
  2. 如何将此路径传递给服务MyService? (想想一个灯箱包装)
  3. 使用解决方案进行更新:

    app.directive("component", function(LightboxService) {
        return {
            restrict: 'E',
            transclude: true,
            replace: true,
            template: "<a href='' ng-click='lb()' ng-transclude></a>",
            link: function (scope, element, attrs) {
                scope.lb = function () {
                    var src = $(element).find("img").attr("src");
                    LightboxService.show(src);
                }
            }
        }
    });
    

1 个答案:

答案 0 :(得分:10)

  1. 您可以通过将源路径绑定到控制器作用域或使用属性的链接方法来访问源路径。

  2. 您无法从模板访问服务。您应该将服务注入控制器并在$ scope中定义一个函数以从模板中调用。

  3. 检查以下指令:

    app.directive("component", function() {
        return {
            scope: {
              ngSrc: "@", //Text Binding
            },
            controller: function($scope, MyService) {
               $scope.doThings = function() {
                   MyService.doThings();
               }
            },
            restrict: 'E',
            transclude: true,
            template: "<a href='{{ng-src}}' ng-click='doThings' ng-transclude></a>"
        }
    });
    

    您可以在此处了解有关具有隔离范围的指令的更多信息: https://umur.io/angularjs-directives-using-isolated-scope-with-attributes/