GVKun编程网logo

angularjs – 禁用$sce服务缺陷(angular按钮禁用)

17

本篇文章给大家谈谈angularjs–禁用$sce服务缺陷,以及angular按钮禁用的知识点,同时本文还将给你拓展AngularJs$compile服务、angularjs–angular.serv

本篇文章给大家谈谈angularjs – 禁用$sce服务缺陷,以及angular按钮禁用的知识点,同时本文还将给你拓展AngularJs $compile服务、angularjs – angular.service对angular.factory、angularjs – 在Angular JS中如何禁用所选列的列排序功能、angularjs – 混合Angular 1.x Angular 6应用程序,包含Angular 1.x中的vanilla JS和TS文件等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

angularjs – 禁用$sce服务缺陷(angular按钮禁用)

angularjs – 禁用$sce服务缺陷(angular按钮禁用)

如果我完全禁用$sce服务会发生什么不好的事情?

angular.module('app').config(function ($sceprovider) {
    $sceprovider.enabled(false);
});

解决方法

如果您100%确定所有应用程序绑定(HTML,URL …)都是安全的,则应该只禁用SCE.例如,如果应用程序在呈现之前始终在服务器或客户端上清理用户输入,则可能不需要SCE强制执行的附加仪式.

但是,您很可能100%肯定所有值都是安全的,特别是当应用程序变大并且由许多开发人员编码时.启用S​​CE会强制应用程序只能使用$sce.trustAsXXX方法之一显式标记为受信任的值.

例如,如果使用ngBindHtml呈现某些HTML,除非分配给ngBindHtml的范围变量包含在$sce.trustAsHtml中,否则AngularJS将抛出错误.设置路由或指令的templateUrl时会发生类似的强制执行.这使得应用程序通过快速失败更加安全,使您有机会审核发生错误的每个位置,并决定是信任还是修复它.

最后要注意的是,如果您包含ngSanitize或实现$sanitize服务,那么您不需要禁用SCE来使用不受信任的HTML值,因为AngularJS将使用$sanitize服务清理不受信任的输入.同样,如果模板URL将源作为应用程序共享,则无需显式包装它.

AngularJs $compile服务

AngularJs $compile服务

正常情况(即非动态插入 DOM 对象)下,ng-click 这样的指令之所以有效(即点击之后能调用注册在可见作用域里的方法),是因为 angular 在 compiling phase(编译阶段)将宿主 DOM 对象(即加入了 ng-click 指令的 DOM 对象)绑定在当前作用域内了。

换言之,当前作用域知道有这个绑定了 ng-click 的 DOM 对象存在,所以 ng-click 才会起作用。

而在你的例子里,HTML 片段是在 compiling phase 后动态插入到 DOM 树中的,即便你写了 ng-click,当前的作用域也不知道这个指令的存在,所以才会无效。

因此,当你动态插入 HTML 片段的时候,要手动调用 $compile 服务并将这个 DOM 对象绑定给当前的作用域(或其他可见作用域,这要看你的应用逻辑了),具体方法如下:

// 在某一个 controller 中,假设用 jQuery 动态插入一个 HTML 片段……$(''selector'').html(
  $compile(    ''<button ng-click="submitForm()">'' + ''Submit'' + ''</button>''
  )($scope)
);

注意要先注入 $compile 服务。

另外,这种方式明显太“恶心”,还有一个更好的办法(但是大量动态插入会有性能损耗)就是利用 ng-repeat 指令,举个例子:

<!-- 在要动态插入的地方…… --><div  ng-repeat="fragment in fragments">
  <button ng-click="submitForm()">{{fragment.text}}</button></div>

这里的 fragments 就是一个空数组(初始状态),所以一开始这里 ng-repeat 不会有任何作用,然后你写一个方法来触发动态插入的动作,把一个类似 { text: ''Submit'' } 这样的对象 push 到这个空数组中,ng-repeat 就会“帮”你把 DOM 对象插入了,并且 ng-repeat 本身就会重新 compile 内涵的 DOM 对象,因此 ng-click 会如你所愿的生效。


ng 中的模板是很重要,也很强大的一个机制,自然少不了单独运用它的方法。不过,即使是单独使用,也是和 DOM 紧密相关的程度:

  • 定义时必须是有 HTML 标签包裹的,这样才能创建 DOM 节点

  • 渲染时必须传入 $scope

之后使用 $compile 就可以得到一个渲染好的节点对象了。当然, $compile 还要做其它一些工作,指令处理什么的。

var TestCtrl = function($scope, $element,$compile){
  $scope.a = ''123'';
  $scope.set = function(){    var tpl = $compile(''<p>hello {{ a }}</p>'');    var e = tpl($scope);
    $element.append(e);
  }
}


AngularJS学习笔记

angularjs – angular.service对angular.factory

angularjs – angular.service对angular.factory

我已经看到 angular.factory()和 angular.service()用于声明服务;然而,我 cannot find angular.service在官方文档的任何地方。

这两种方法有什么区别?哪个应该用于什么(假设他们做不同的事情)?

angular.service('myService',myServiceFunction);
  angular.factory('myFactory',myFactoryFunction);

我有困难包围我的头这个概念,直到我把它给自己这样的方式:

服务:你写的功能将是新的:

myInjectedService  <----  new myServiceFunction()

工厂:你写的函数(构造函数)将被调用:

myInjectedFactory  <---  myFactoryFunction()

你用这个做什么取决于你,但有一些有用的模式…

比如编写一个服务函数来公开一个公共API:

function myServiceFunction() {
  this.awesomeApi = function(optional) {
    // calculate some stuff
    return awesomelistofValues;
  }
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.awesome = myInjectedService.awesomeApi();

或者使用工厂函数公开公共API:

function myFactoryFunction() {
  var aPrivateVariable = "yay";

  function hello() {
    return "hello mars " + aPrivateVariable;
  }

  // expose a public API
  return {
    hello: hello
  };
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.hello = myInjectedFactory.hello();

或者使用工厂函数返回构造函数:

function myFactoryFunction() {
    return function() {
        var a = 2;
        this.a2 = function() {
            return a*2;
        };
    };
}
---------------------------------------------------------------------------------
// Injected in your controller
var myShinyNewObject = new myInjectedFactory();
$scope.four = myShinyNewObject.a2();

使用哪一个?

你可以完成同样的事情与两者。然而,在某些情况下,工厂给你一个更灵活的创建一个更简单的语法的注入。这是因为虽然myInjectedService必须始终是一个对象,myInjectedFactory可以是一个对象,一个函数引用或任何值。例如,如果你编写一个服务来创建一个构造函数(如上面的最后一个例子),它将被实例化如下:

var myShinyNewObject = new myInjectedService.myFunction()

这可能比这不太可取:

var myShinyNewObject = new myInjectedFactory();

(但是你应该小心使用这种类型的模式,因为控制器中的新对象创建了难以模拟测试的难以跟踪的依赖。更好的服务管理对象的集合你比使用new()wily-nilly。)

还有一件事,他们都是单身人士…

还要记住,在这两种情况下,angular都帮助你管理单身。无论注入服务或函数的位置或次数,您都将获得相同的对象或函数的引用。 (除了当工厂简单地返回一个像数字或字符串一样的值时,在这种情况下,你总是得到相同的值,但不是一个引用。)

angularjs – 在Angular JS中如何禁用所选列的列排序功能

angularjs – 在Angular JS中如何禁用所选列的列排序功能

在jquery数据表中,我可以禁用特定的列排序依据
"aoColumnDefs": [{
                'bSortable': false,'aTargets': [0,7]
            }]

任何人都知道如何在角度JS中做到这一点?

<tabledatatable="ng" dt-options="dtOptions" id="contacts-list-table">
</table>

myApp.controller("ListCtr",['DTOptionsBuilder',function(DTOptionsBuilder) {
  $scope.dtOptions = DTOptionsBuilder.newOptions().withDOM('C<"clear">lfrtip') 
}])

这段代码隐藏了我的搜索栏但是无法隐藏我的第一列和第四列的排序功能?

角度数据表等价于
aoColumnDefs: [{ bSortable: false,aTargets: [0,4] }]

$scope.dtColumnDefs = [
   DTColumnDefBuilder.newColumnDef(0).notSortable(),DTColumnDefBuilder.newColumnDef(4).notSortable()
];

<tabledt-column-defs="dtColumnDefs" datatable="ng" dt-options="dtOptions" id="contacts-list-table"></table>

您必须在控制器中包含DTColumnDefBuilder:

myApp.controller("ListCtr",'DTColumnDefBuilder',function(DTOptionsBuilder,DTColumnDefBuilder) {
       $scope.dtOptions = DTOptionsBuilder.newOptions().withDOM('C<"clear">lfrtip');
       $scope.dtColumnDefs = [
          DTColumnDefBuilder.newColumnDef(0).notSortable(),DTColumnDefBuilder.newColumnDef(4).notSortable()
       ];
    }
])

见http://l-lin.github.io/angular-datatables/archives/#!/api.

angularjs – 混合Angular 1.x Angular 6应用程序,包含Angular 1.x中的vanilla JS和TS文件

angularjs – 混合Angular 1.x Angular 6应用程序,包含Angular 1.x中的vanilla JS和TS文件

当AngularJS文件是JS和TS时,我正在尝试构建混合应用程序.
我似乎无法添加到JS控制器的路由.

我依赖于以下example并执行以下操作:

const statesConfigBlock = ['$stateProvider',$stateProvider => {
  $stateProvider.state('main',{
    url: '/main',templateUrl: 'app/components/layout/mainView.html',controller: 'mainController as main'
  })
}];
appModuleAngularJS.config(statesConfigBlock);

虽然我有一个mainCtrl.js文件定义为:

var app = angular.module('myApp',[]);

(function(app) {
  'use strict';

  app.controller('mainController',[
      function () {
        console.log("blah");

      }]);
})(app);

当我运行应用程序时,我得到:

The controller with the name ‘mainController’ is not registered

但是当我在控制台中运行时,我确实看到了它:

angular.module('myApp')._invokeQueue.filter(function(el){
  return el[0] === "$controllerProvider";
}).map(function(el){
  return el[2]["0"];
});

解决方法

好吧,我想我成功了.它可能不是最好的解决方案但是这里.

首先,我创建了一个包含模块声明的js文件:

appDependencies = [];
app = angular.module('myApp',appDependencies);

所有Angular 1.x控制器和服务都使用全局变量app,如下所示:

(function(app) {
  'use strict';

  app.controller('mainController',[
      function () {
        console.log("blah");

      }]);
})(app);

最后,Angular 1.x模块ts文件使用全局应用程序并向其添加依赖项:

...

declare const app: any;
declare var appDependencies: any;

export const appModuleAngularJS = app;

angular.forEach([
  uiRouter,upgradeModule.name
],module => {
  appDependencies.push(module);
});

...

const statesConfigBlock = ['$stateProvider',controller: 'mainController as main'
  })
}];
appModuleAngularJS.config(statesConfigBlock);

...

现在,index.html文件中js导入的顺序非常重要.应该首先应用减速文件,然后是所有Angular 1.x控制器和服务,然后是转换为js文件的* .ts文件.

这个解决方案对我有用,但我非常乐意阅读更好的解决方案.

干杯!

我们今天的关于angularjs – 禁用$sce服务缺陷angular按钮禁用的分享已经告一段落,感谢您的关注,如果您想了解更多关于AngularJs $compile服务、angularjs – angular.service对angular.factory、angularjs – 在Angular JS中如何禁用所选列的列排序功能、angularjs – 混合Angular 1.x Angular 6应用程序,包含Angular 1.x中的vanilla JS和TS文件的相关信息,请在本站查询。

本文标签: