当前位置: 首页 > 面试题库 >

如何在AngularJS应用程序中添加一些小的实用程序函数?

齐涛
2023-03-14
问题内容

我想在AngularJS应用程序中添加一些实用程序功能。例如:

$scope.isNotString = function (str) {
    return (typeof str !== "string");
}

将它们添加为服务的最佳方法是吗?从我所阅读的内容中我可以做到,但是然后我想在HTML页面中使用它们,因此如果它们在服务中仍然可行吗?例如,我可以使用以下内容:

 <button data-ng-click="doSomething()"
         data-ng-disabled="isNotString(abc)">Do Something
 </button>

有人可以举例说明如何添加这些内容。我应该创建服务还是有其他实现方法。最重要的是,我希望将这些实用程序功能存储在文件中,而不要与主要设置的另一部分结合使用。

我了解有一些解决方案,但没有一个如此明确。

解决方案1 -Urban提出

$scope.doSomething = ServiceName.functionName;

这里的问题是我有20个功能和10个控制器。如果执行此操作,则意味着要向每个控制器添加很多代码。

解决方案2- 我提议

    var factory = {

        Setup: function ($scope) {

            $scope.isNotString = function (str) {
                return (typeof str !== "string");
            }

这样做的缺点是,在每个控制器启动时,我会对通过$ scope的每个服务有一个或多个这些Setup调用。

解决方案3 -Urban提出

Urban提出的创建通用服务的解决方案看起来不错。这是我的主要设置:

var app = angular
    .module('app', ['ngAnimate', 'ui.router', 'admin', 'home', 'questions', 'ngResource', 'LocalStorageModule'])
    .config(['$locationProvider', '$sceProvider', '$stateProvider',
        function ($locationProvider, $sceProvider, $stateProvider) {

            $sceProvider.enabled(false);
            $locationProvider.html5Mode(true);

我是否应该在其中添加通用服务,我该怎么做?


问题答案:

编辑7/1/15:

我在很久以前就写了这个答案,并且有一段时间没跟上角度了,但似乎这个答案仍然相对受欢迎,因此我想指出一点@nicolas下面做的很好。首先,注入$
rootScope并附加那里的助手将使您不必为每个控制器添加它们。另外-
我同意,如果您要添加的内容应被视为Angular服务或过滤器,则应以这种方式将其应用于代码中。

另外,从当前版本1.4.2开始,Angular公开了一个“提供程序” API,该API可以注入到配置块中。有关更多信息,请参见以下资源:

https://docs.angularjs.org/guide/module#module-loading-
dependencies

AngularJS依赖注入module.config内部的值

我认为我不会在下面更新实际的代码块,因为这些天我并没有真正积极地使用Angular,并且我真的不想冒一个新的答案而又不觉得它实际上符合最新的最佳做法。实践。如果有人愿意接受,那么一定要去做。

编辑2/3/14:

在考虑了这一点并阅读了其他一些答案之后,我实际上认为我更喜欢@Brent Washburne和@Amogh
Talpallikar提出的方法的变体。特别是如果您正在寻找isNotString()之类的实用程序。这里的明显优势之一是,您可以在角度代码之外重新使用它们,并且可以在配置函数中使用它们(对于服务则不能这样做)。

话虽这么说,如果您正在寻找一种通用的方式来重用应该正确地用作服务的内容,那么我认为旧的答案仍然是一个不错的选择。

我现在要做的是:

app.js:

var MyNamespace = MyNamespace || {};

 MyNamespace.helpers = {
   isNotString: function(str) {
     return (typeof str !== "string");
   }
 };

 angular.module('app', ['app.controllers', 'app.services']).                             
   config(['$routeProvider', function($routeProvider) {
     // Routing stuff here...
   }]);

controller.js:

angular.module('app.controllers', []).                                                                                                                                                                                  
  controller('firstCtrl', ['$scope', function($scope) {
    $scope.helpers = MyNamespace.helpers;
  });

然后,您可以在部分使用:

<button data-ng-click="console.log(helpers.isNotString('this is a string'))">Log String Test</button>

下面的旧答案:

最好将它们作为服务包含在内。如果您打算在多个控制器之间重用它们,包括将它们作为服务使用,将使您不必重复代码。

如果您想在html部分中使用服务功能,则应将它们添加到该控制器的作用域中:

$scope.doSomething = ServiceName.functionName;

然后,您可以在部分使用:

<button data-ng-click="doSomething()">Do Something</button>

您可以通过以下方式使这一切保持井井有条,并避免太多麻烦:

将控制器,服务和路由代码/配置分成三个文件:controllers.js,services.js和app.js。顶层模块是“
app”,其中有app.controllers和app.services作为依赖项。然后,可以在自己的文件中将app.controllers和app.services声明为模块。该组织结构仅取自Angular
Seed:

app.js:

 angular.module('app', ['app.controllers', 'app.services']).                             
   config(['$routeProvider', function($routeProvider) {
     // Routing stuff here...
   }]);

services.js:

 /* Generic Services */                                                                                                                                                                                                    
 angular.module('app.services', [])                                                                                                                                                                        
   .factory("genericServices", function() {                                                                                                                                                   
     return {                                                                                                                                                                                                              
       doSomething: function() {   
         //Do something here
       },
       doSomethingElse: function() {
         //Do something else here
       }
    });

controller.js:

angular.module('app.controllers', []).                                                                                                                                                                                  
  controller('firstCtrl', ['$scope', 'genericServices', function($scope, genericServices) {
    $scope.genericServices = genericServices;
  });

然后,您可以在部分使用:

<button data-ng-click="genericServices.doSomething()">Do Something</button>
<button data-ng-click="genericServices.doSomethingElse()">Do Something Else</button>

这样,您只需向每个控制器添加一行代码,就可以在可访问该范围的任何地方访问任何服务功能。



 类似资料:
  • 我有一个java应用程序,需要部署在weblogic服务器中。我目前正在为该应用程序制作ear文件。我的ear文件中有一个ejb jar。我想将log4j2 jar添加到此应用程序中。所以我的文件夹结构是 目前,我已经将JAR放在APP-INF文件夹/lib和META-INF/application中。xml我把JAR放在了模块中。这是我的申请表。xml 但它不接受log4j罐子。有什么解决方案吗

  • 问题内容: 我一直在从事一个更像框架的项目,并且可以安装几个应用程序/模块。像基本的应用商店或google.play商店一样看到它。这是一个Intranet应用程序,所有模块都可以添加到您的用户帐户中。 该框架已经在开发中,但是我现在正在围绕应用程序/模块的想法。(链接到开发中的概念证明,可以在这里找到) 一个应用程序应该是独立的,并且不能突然包含框架中的脚本,这可以通过在单独的模块中进行结构化来

  • 我试图在Firebase中创建一个动态链接,当我选择android应用程序时,它显示一个错误,说“将SHA-1添加到这个android应用程序”,我已经添加了一个凭据,但我不确定我到底如何“将SHA-1添加到应用程序” 这是怎么做到的?

  • 嵌入简单的、易于编写的脚本,从而利用 Groovy 的简单性 您有没有想过在自己相对复杂的 Java 程序中嵌入 Groovy 简单的、易于编写的脚本呢?在这一期 实战 Groovy 系列文章中,Andrew Glover 将介绍把 Groovy 集成到 Java 代码中的多种方法,并解释在什么地方、什么时候适合这么做。 如果您一直在阅读这个系列,那么您应该已经看到有各种各样使用 Groovy 的

  • 问题内容: 我需要能够动态加载/卸载角度应用程序而不会引起内存泄漏。在jQuery中,您可以执行相应的销毁代码,事件处理程序未绑定等。 我一直无法在有角度的文档中找到任何内容,提及启动应用程序后可能会拆除应用程序的可能性。 我的第一次尝试是像这样破坏rootScope: 但这似乎不起作用,而且我不确定即使清除了注入器和服务也将如何清理。 应该怎么做? 问题答案: 2013年3月10日更新: 我发现

  • 我当前的设置是使用单独的,我可以在使用之间切换;这是可行的,但是函数声明需要在不同的方言中重复,感觉不太理想。 看15.29。非标准化函数在Hibernate文档中,它说我应该使用,这似乎更易于移植,并且不需要扩展所有三种方言。 我的问题是:如何访问Spring Boot(1.3)应用程序中的Hibernate类?缺省情况下没有要注入的bean,也没有bean。 有人能给我指明正确的方向吗,或者用