欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

AngularJS動(dòng)態(tài)綁定HTML的方法分析

 更新時(shí)間:2016年11月07日 10:17:01   作者:破狼  
這篇文章主要介紹了AngularJS動(dòng)態(tài)綁定HTML的方法,結(jié)合實(shí)例形式分析了AngularJS實(shí)現(xiàn)動(dòng)態(tài)綁定HTML的相關(guān)操作指令用法與使用注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了AngularJS動(dòng)態(tài)綁定HTML的方法。分享給大家供大家參考,具體如下:

在Web前端開發(fā)中,我們經(jīng)常會(huì)遇見需要?jiǎng)討B(tài)的將一些來自后端或者是動(dòng)態(tài)拼接的HTML字符串綁定到頁面DOM顯示,特別是在內(nèi)容管理系統(tǒng)(CMS:是Content Management System的縮寫),這樣的需求,更是遍地皆是。

對(duì)于對(duì)angular的讀者肯定首先會(huì)想到ngBindHtml,對(duì),angular為我們提供了這個(gè)指令來動(dòng)態(tài)綁定HTML,它會(huì)將計(jì)算出來的表達(dá)式結(jié)果用innerHTML綁定到DOM。但是,問題并不是這么簡單。在Web安全中XSS(Cross-site scripting,腳本注入攻擊),它是在Web應(yīng)用程序中很典型的計(jì)算機(jī)安全漏洞。XSS攻擊指的是通過對(duì)網(wǎng)頁注入可執(zhí)行客戶端代碼且成功地被瀏覽器執(zhí)行,來達(dá)到攻擊的目的,形成了一次有效XSS攻擊,一旦攻擊成功,它可能會(huì)獲取到用戶的一些敏感信息、改變用戶的體驗(yàn)、誘導(dǎo)用戶等非法行為,有時(shí)XSS攻擊還會(huì)合其他攻擊方式同時(shí)實(shí)施比如SQL注入攻擊服務(wù)器和數(shù)據(jù)庫、Click劫持、相對(duì)鏈接劫持等實(shí)施釣魚,它帶來的危害是巨大的,也是web安全的頭號(hào)大敵。更多的Web安全問題,請(qǐng)參考wiki https://en.wikipedia.org/wiki/Cross-site_scripting%E3%80%82

在angular中默認(rèn)是不相信添加的HTML內(nèi)容,對(duì)于添加的HTML內(nèi)容,首先必須利用$sce.trustAsHtml,告訴angular這是可信的HTML內(nèi)容。否則你將會(huì)得到$sce:unsafe的異常錯(cuò)誤。

Error: [$sce:unsafe] Attempting to use an unsafe value in a safe context.

下面是一個(gè)綁定簡單的angular鏈接的demo:

HTML:

<div ng-controller="DemoCtrl as demo">
  <div ng-bind-html="demo.html"></div>
</div>

JavaScript:

angular.module("com.ngbook.demo", [])
  .controller("DemoCtrl", ["$sce", function($sce) {
    var vm = this;
    var html = '<p>hello <a ;
    vm.html = $sce.trustAsHtml(html);
    return vm;
  }]);

對(duì)于簡單的靜態(tài)HTML,這個(gè)問題就解決了。但對(duì)于復(fù)雜的HTML,這里的復(fù)雜是指帶有angular表達(dá)式、指令的HTML模板,對(duì)于它們來說,我們不僅希望綁定大DOM顯示,同時(shí)還希望得到angular強(qiáng)大的雙向綁定機(jī)制。ngBindHhtml并不會(huì)和$scope關(guān)聯(lián)雙向綁定,如果在HTML中存在ngClick、ngHref、ngSHow、ngHide等angular指令,它們并不會(huì)被compile,點(diǎn)擊這些按鈕,也不會(huì)發(fā)生任何反應(yīng),綁定的表達(dá)式也不會(huì)在更新。例如嘗試將上次的鏈接變?yōu)椋簄g-href=“demo.link”,鏈接并不會(huì)被解析,在DOM看見的仍然會(huì)是原樣的HTML字符串。

在angular中的所有指令要生效,都需要經(jīng)過compile,在compile中包含了pre-link和post-link,連接上特定行為,才能工作。大部分情況下compile,是會(huì)在angular啟動(dòng)時(shí),自動(dòng)compile的。但如果是對(duì)于動(dòng)態(tài)添加的模板,則需要手動(dòng)的compile。angular中為我們提供了$compile服務(wù)來實(shí)現(xiàn)這一功能。下面是一個(gè)比較通用的compile例子:

HTML:

<body ng-controller="DemoCtrl as demo">
  <dy-compile html="{{demo.html}}">
  </dy-compile>
  <button ng-click="demo.change();">change</button>
</body>

JavaScript:

angular.module("com.ngbook.demo", [])
  .directive("dyCompile", ["$compile", function($compile) {
    return {
      replace: true,
      restrict: 'EA',
      link: function(scope, elm, iAttrs) {
        var DUMMY_SCOPE = {
            $destroy: angular.noop
          },
          root = elm,
          childScope,
          destroyChildScope = function() {
            (childScope || DUMMY_SCOPE).$destroy();
          };
        iAttrs.$observe("html", function(html) {
          if (html) {
            destroyChildScope();
            childScope = scope.$new(false);
            var content = $compile(html)(childScope);
            root.replaceWith(content);
            root = content;
          }
          scope.$on("$destroy", destroyChildScope);
        });
      }
    };
  }])
  .controller("DemoCtrl", [function() {
    var vm = this;
    vm.html = '<h2>hello : <a ng-href="{{demo.link}}">angular</a></h2>';
    vm.link = 'https://angular.io/';
    var i = 0;
    vm.change = function() {
      vm.html = '<h3>change after : <a ng-href="{{demo.link}}">' + (++i) + '</a></h3>';
    };
  }]);

這里創(chuàng)建了一個(gè)叫dy-compile的指令,它首先會(huì)監(jiān)聽綁定屬性html值的變化,當(dāng)html內(nèi)容存在的時(shí)候,它會(huì)嘗試首先創(chuàng)個(gè)一個(gè)子scope,然后利用$compile服務(wù)來動(dòng)態(tài)連接傳入的html,并替換掉當(dāng)前DOM節(jié)點(diǎn);這里創(chuàng)建子scope的原因,是方便在每次銷毀DOM的時(shí),也能容易的銷毀掉scope,去掉HTML compile帶來的watchers函數(shù),并在最后的父scope銷毀的時(shí)候,也會(huì)嘗試銷毀該scope。

因?yàn)橛辛松线叺腸ompile的編譯和連接,則ngHref指令就可以生效了。這里只是嘗試給出動(dòng)態(tài)compile angular模塊的例子,具體的實(shí)現(xiàn)方式,請(qǐng)參照你的業(yè)務(wù)來聲明特定的directive。

希望本文所述對(duì)大家AngularJS程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • AngularJS中$http使用的簡單介紹

    AngularJS中$http使用的簡單介紹

    在AngularJS中主要使用$http服務(wù)與遠(yuǎn)程http服務(wù)器交互,本篇文章主要介紹了AngularJS中$http使用的簡單介紹,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-03-03
  • AngularJS實(shí)現(xiàn)的錨點(diǎn)樓層跳轉(zhuǎn)功能示例

    AngularJS實(shí)現(xiàn)的錨點(diǎn)樓層跳轉(zhuǎn)功能示例

    這篇文章主要介紹了AngularJS實(shí)現(xiàn)的錨點(diǎn)樓層跳轉(zhuǎn)功能,涉及AngularJS事件響應(yīng)實(shí)現(xiàn)錨點(diǎn)跳轉(zhuǎn)功能的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • AngularJS基礎(chǔ) ng-open 指令簡單實(shí)例

    AngularJS基礎(chǔ) ng-open 指令簡單實(shí)例

    本文主要介紹AngularJS ng-open 指令,這里幫大家整理了ng-open指令的基本資料,有需要的小伙伴可以參考下
    2016-08-08
  • Angular 多級(jí)路由實(shí)現(xiàn)登錄頁面跳轉(zhuǎn)(小白教程)

    Angular 多級(jí)路由實(shí)現(xiàn)登錄頁面跳轉(zhuǎn)(小白教程)

    這篇文章主要介紹了Angular 多級(jí)路由實(shí)現(xiàn)登錄頁面跳轉(zhuǎn)(小白教程),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 詳解AngularJS實(shí)現(xiàn)表單驗(yàn)證

    詳解AngularJS實(shí)現(xiàn)表單驗(yàn)證

    這篇文章主要介紹了AngularJS實(shí)現(xiàn)表單驗(yàn)證,客戶端表單驗(yàn)證是AngularJS里面最酷的功能之一。AngularJS表單驗(yàn)證可以讓你從一開始就寫出一個(gè)具有交互性和可相應(yīng)的現(xiàn)代HTML5表單,對(duì)AngularJS表單驗(yàn)證感興趣的小伙伴們可以參考一下
    2015-12-12
  • AngularJS中的$parse服務(wù)與$eval服務(wù)用法實(shí)例

    AngularJS中的$parse服務(wù)與$eval服務(wù)用法實(shí)例

    這篇文章主要介紹了AngularJS中的$parse服務(wù)與$eval服務(wù)用法,結(jié)合實(shí)例形式分析了AngularJS中$parse服務(wù)與$eval服務(wù)的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2023-05-05
  • SpringMVC簡單整合Angular2的示例

    SpringMVC簡單整合Angular2的示例

    這篇文章主要介紹了SpringMVC簡單整合Angular2的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • AngularJs concepts詳解及示例代碼

    AngularJs concepts詳解及示例代碼

    本文主要介紹AngularJs concepts,這里整理了詳細(xì)資料及簡單示例代碼來講解相關(guān)知識(shí),有學(xué)習(xí)這部分知識(shí)的朋友可以參考下
    2016-09-09
  • angularjs 源碼解析之scope

    angularjs 源碼解析之scope

    $scope 的使用貫穿整個(gè) Angular App 應(yīng)用,它與數(shù)據(jù)模型相關(guān)聯(lián),同時(shí)也是表達(dá)式執(zhí)行的上下文.有了 $scope 就在視圖和控制器之間建立了一個(gè)通道,基于作用域視圖在修改數(shù)據(jù)時(shí)會(huì)立刻更新 $scope,同樣的 $scope 發(fā)生改變時(shí)也會(huì)立刻重新渲染視圖.
    2016-08-08
  • AngularJS中watch監(jiān)聽用法分析

    AngularJS中watch監(jiān)聽用法分析

    這篇文章主要介紹了AngularJS中watch監(jiān)聽用法,較為詳細(xì)的分析了$watch的具體功能、相關(guān)參數(shù)用法與使用注意事項(xiàng),需要的朋友可以參考下
    2016-11-11

最新評(píng)論