angularjs當使用子控制器時,ng-if和ng-show使用有區(qū)別

背景:

運營系統(tǒng)很多日報月報骗绕,很多列表藐窄,列表有分頁,項目對請求列表和分頁做了封裝酬土。
有一個具體的需求是荆忍,一個列表,打開其中一項撤缴,顯示一個與該項相關的新的列表刹枉,為了返回后不重置列表的搜索條件和保留當前頁數(shù),不打算用打開新的頁面去做新的列表(在新頁面返回后屈呕,頁面數(shù)據(jù)都沒了嘶卧,也懶得用緩存),而是用子控制器的方式凉袱,如下圖:

111111111111111111.png

視圖文件代碼如下(樣式省略):

<div ng-include="'page-header.html'"></div>
<div ng-if="mainList">
    ............
    <div ng-include="'list_temp.html'"></div>
</div>
<!--詳情列表(打開的新列表)-->
<div ng-if="!mainList">
        ........................
        <div ng-controller="subCtrl">
            <div ng-include="'list_temp.html'"></div>
        </div>
        <button ng-click="closePopup()">退出</button>
    </div>
</div>

ng-include中的list_temp.html的代碼(樣式省略)如下:

<div class="table-wrap">
    <table>
        <thead>
           ..................
        </thead>
        <tbody>
            <tr ng-repeat="item in tableBodyList">
                <td ng-repeat="(props, value) in item">{{value}}</td>
                .................
            </tr>
        </tbody>
        <tbody ng-if="tableBodyList.length == 0">
            <td style="text-align: center">暫無數(shù)據(jù)</td>
        </tbody>
    </table>
    <!--自定義分頁組件芥吟,代碼略-->
    <pagination conf="paginationConf"></pagination>
</div>

javascript代碼:

app.controller('parentCtrl', function($scope...){
    ................
    //ng-if的條件值
    $scope.mainList = true;
    //顯示詳情列表
    $scope.showDetailList = function(){
          $scope.mainList = false;
    }
});
app.controller('subCtrl', function($scope...){
    ............
});

上述代碼是正確的實現(xiàn)方式,下面說一下我走過的坑:

剛開始在視圖中用ng-show专甩,而不是ng-if钟鸵。 用ng-show在頁面加載時,父涤躲,子控制同時初始化棺耍,同時執(zhí)行了,在打開詳情列表時种樱,我用$scope.$broadcast的方式控制子控制在點擊的時候執(zhí)行蒙袍,
javascript代碼:

app.controller('parentCtrl', function($scope...){
    .................
    //ng-show的條件值
    $scope.mainList = true;
    //顯示詳情列表
    $scope.showDetailList = function(item){
          $scope.mainList = false;
          $scope.$broadcast("parentChange", item.id);
    }
});
app.controller('subCtrl', function($scope...){
    $scope.$on("parentChange", function(e, m) {
            $scope.detailId = m;
            ...............................
    });
});

這時父控制器的值會影響子控制器中的值,子控制器界面上操作事件嫩挤,也會調用父控制器中的事件方法害幅,導致混亂,
如果用ng-if岂昭,當true時以现,ng-controller子控制器才會初始化,為false時,在頁面加載的時候不會初始化邑遏,當父控制中的方法把ng-if條件值改為true時佣赖,子控制器執(zhí)行了,這個時候也不需要$scope.$broadcast廣播的方式了记盒,父控制器的值也不會影響子控制器中的值和方法了憎蛤。

下面是ng-if、ng-show纪吮、ng-hide的區(qū)別:

當一個元素被ng-if從DOM中移除(ng-if=false)俩檬,同它關聯(lián)的作用域也會被銷毀。而且當它重新加入DOM中時(ng-if=true)彬碱,會通過原型繼承從它的父作用域生成一個新的作用域豆胸。也就是說ng-if會新建作用域,而ng-show和ng-hide則不會巷疼。

ng-show和ng-hide根據(jù)所給表達式的值來顯示或隱藏HTML元素晚胡,ng-hide功能類似,但作用相反嚼沿。元素的顯示或隱藏是通過改變CSS的display屬性值來實現(xiàn)的估盘。

StackOverflow文章,也有人提問ng-if和ng-show的差別骡尽。這里直接附上:
ng-if
will remove elements from DOM. This means that all your handlers or anything else attached to those elements will be lost. For example, if you bound a click handler to one of child elements, when ng-if
evaluates to false, that element will be removed from DOM and your click handler will not work any more, even after ng-if
later evaluates to true and displays the element. You will need to reattach the handler.
ng-show/ng-hide
does not remove the elements from DOM. It uses CSS styles to hide/show elements (note: you might need to add your own classes). This way your handlers that were attached to children will not be lost.
ng-if
creates a child scope while ng-show/ng-hide
does not

Elements that are not in the DOM have less performance impact and your web app might appear to be faster when using ng-if
compared to ng-show/ng-hide
. In my experience, the difference is negligible. Animations are possible when using both ng-show/ng-hide and ng-if, with examples for both in the Angular documentation.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末遣妥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子攀细,更是在濱河造成了極大的恐慌箫踩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谭贪,死亡現(xiàn)場離奇詭異境钟,居然都是意外死亡,警方通過查閱死者的電腦和手機俭识,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門慨削,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人套媚,你說我怎么就攤上這事缚态。” “怎么了堤瘤?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵玫芦,是天一觀的道長。 經常有香客問我宙橱,道長姨俩,這世上最難降的妖魔是什么蘸拔? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任师郑,我火速辦了婚禮环葵,結果婚禮上,老公的妹妹穿的比我還像新娘宝冕。我一直安慰自己张遭,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布地梨。 她就那樣靜靜地躺著菊卷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宝剖。 梳的紋絲不亂的頭發(fā)上洁闰,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音万细,去河邊找鬼扑眉。 笑死,一個胖子當著我的面吹牛赖钞,可吹牛的內容都是我干的腰素。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼雪营,長吁一口氣:“原來是場噩夢啊……” “哼弓千!你這毒婦竟也來了?” 一聲冷哼從身側響起献起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤洋访,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谴餐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姻政,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年总寒,在試婚紗的時候發(fā)現(xiàn)自己被綠了扶歪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡摄闸,死狀恐怖善镰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情年枕,我是刑警寧澤炫欺,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站熏兄,受9級特大地震影響品洛,放射性物質發(fā)生泄漏树姨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一桥状、第九天 我趴在偏房一處隱蔽的房頂上張望帽揪。 院中可真熱鬧,春花似錦辅斟、人聲如沸转晰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽查邢。三九已至,卻和暖如春酵幕,著一層夾襖步出監(jiān)牢的瞬間扰藕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工芳撒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邓深,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓番官,卻偏偏與公主長得像庐完,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子徘熔,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容