AngularJS是否可以使用通过html范围直接注入的服务?

时间:2018-11-05 09:48:06

标签: javascript angularjs angularjs-directive angularjs-scope angularjs-service

我有此指令:

app.directive("saveButton", ($rootScope, ConfirmationModal) => {
  return {
    templateUrl: "/structure/header/components/save-button/save-button.html",
    scope: true,
    link: function($scope, element, attrs) {

      $scope.ConfirmationModal = ConfirmationModal;

    }
  }
});

我有指令的以下HTML模板:

<button ng-click="ConfirmationModal.default()">
  Click here
</button>

以上操作正常,但请注意,在指令JS文件中 我已将服务附加到范围:$scope.ConfirmationModal = ConfirmationModal;

我的问题是,是否可以在没有附件的情况下使服务可用?

1 个答案:

答案 0 :(得分:1)

首先,我认为您真的不应该直接使用服务。我认为有角度的方式更像是在控制器/组件内部使用服务。

简单答案为否。没有附件就无法提供服务。但是,假设您需要直接使用它,因此,是的,您需要将其绑定到作用域。就像您已经在这里所做的一样。

但是,如果您真的不想在这里绑定它,则不能在父控制器/组件中绑定它。默认情况下,指令是继承父$ scope的,因此您可以在父对象中绑定一次,所有在此父(控制器或组件)内部的'saveButton'指令也将拥有它。

PageURL := APEX_UTIL.PREPARE_URL(p_url => 'f?p=' || AppId || ':' || PageAlias || ':' || SessionId ||'::NO::' || Arguments || ':' || ArgumentValues, p_checksum_type => Checksum); 

此外,您可以将特定范围变量传递给指令,如下所示:

angular.module('docsIsolateScopeDirective', [])
 .controller('ParentController', ['$scope','ConfirmationModal' function($scope, ConfirmationModal) {
 $scope.ConfirmationModal = ConfirmationModal;
}])
.directive('myCustomer', function() {
  return {
    templateUrl: '/structure/header/components/save-button/save-button.html'
  };
});

然后您从父母那里传递了

scope: {
  ConfirmationModal: '=ConfirmationModal'
},

所以总的来说,我建议在这里使用component over指令,因为它是'statefull',这将更加方便。然后在组件控制器内部使用Service。并使用诸如commit()函数之类的内容并在控制器内部调用服务,并仅绑定此提交的作用域。

希望有帮助, 干杯。

参考:https://docs.angularjs.org/guide/directive