2016-05-04 208 views
0

我創建了一個頁面,您可以在面板中查看用戶的大量細節。AngularJS - 這是什麼正確的方法?

每個面板包含的一些信息,從服務接收,有時上有動作。

我有大約10板,和觀衆決定,他希望看到的東西。

將這些面板中的每一個設置爲單獨的控制器, 或者只有具有動作的面板需要位於單獨的控制器中,或者一個控制器中的所有面板都正確嗎?


如果每個面板控制器,和我的代碼是這樣的:

div class="panel panel-default"> 
    <div class="panel-heading">Panel Heading</div> 
    <div class="panel-body" ng-controller="historyPanel" ng-include="'panels/history.html'"></div> 
</div> 

有沒有辦法讓我知道,如果面板是空的?

例如,我有一個歷史的面板,我想告訴時,纔會有歷史表明,我不想秀「沒有歷史」,只是想隱藏面板。

但我想保持面板代碼history.html視圖之外。

+0

好奇,您使用的是什麼版本的棱角分明? – alphapilgrim

+0

@alphapilgrim最新v1(1.5.5) – Amit

+0

你對面板使用ng-repeat嗎?如果你有一支筆/蹲子,那就很好。 – alphapilgrim

回答

2

你應該考慮爲此創建一個指令。您可以創建一個包含所有10個面板的單個指令,並提供一個屬性來指定要顯示哪個面板,也可以創建10個不同的指令。

喜歡的東西:

<my-panel panel="history" ng-show="userPanel.history.display"></my-panel> 
<my-panel panel="settings" ng-show="userPanel.settings.display"></my-panel> 
<my-panel panel="friends" ng-show="userPanel.friends.display"></my-panel> 
<my-panel panel="music" ng-show="userPanel.music.display"></my-panel> 

然後你的範圍控制器可能有類似:

app.controller('MyController', function($scope) { 
    $scope.userPanel = { 
     history: { display: true }, 
     settings: { display: true }, 
     friends: { display: true }, 
     music: { display: false } 
    } 
}); 

通過這種方式,你可以從其中有要顯示其面板的用戶偏好的服務加載數據。

+0

好的,這是我認爲更好..有沒有辦法使用ng-repeat創建不同的指令? (如果我的指令去做,伊利諾伊州創造他們的10,而不是1) 此外,在這個例子中,我怎麼知道,如果顯示「歷史」的例子?有沒有辦法從指令做$ scope.ngShow = false;? – Amit

+0

通過在指令返回的元素上放入'ng-show'(或者說'ng-if'),還可以在指令中處理條件顯示。是的,使用指令的標籤可以通過'ng-repeat'創建,例如使用' Aaron

+0

好,謝謝。我用這個,用transclude。我可以轉換列表項格式,並在交換機上處理其他項。 – Amit

1

嘗試這樣的事情,儘量不要不惜一切代價注入$範圍。 :)

function PanelCtrl() { 
    'use strict'; 

    var ctrl = this; 

    ctrl.panels = [{ 
    "id": 0, 
    "name": "Lucia Oconnor", 
    "history": "my history" 
    }, { 
    "id": 1, 
    "name": "Stevenson Mcintosh", 
    "history": "my history" 
    }, { 
    "id": 2, 
    "name": "Spears Sims", 
    "history": "my history" 
    }]; 

} 

function panel() { 
    'use strict'; 

    return { 
    restrict: 'E', 
    scope: {}, 
    bindToController: { 
     //Depends what youd like to do with the PanelCtrl 
     //'&': use a function on that ctrl 
     //'=': two way data binding 
    }, 
    controller: 'PanelCtrl as ctrl', 
    templateUrl: './templates/panel.ng.html' 
    }; 
} 

angular 
    .module('app', []) 
    .controller('PanelCtrl', PanelCtrl) 
    .directive('panel', panel); 

這將是模板:

//also if static content might want to use--one time bindings. 
    // that would be ::panel.name 
    <div class="panel panel-default" id="panel_{{panel.id}}"> 
    <div class="panel-heading">{{Panel.name}}</div> 
    <div class="panel-body">{{Panel.history}}</div> 
    </div> 

這將是你的HTML:

//be sure to include track by, major perf gains. 
<div class="container" ng-repeat="panel in ctrl.panels track by panel.id"> 
    <panel bind="here" ng-if="ctrl.history.length"></panel> 
</div> 
+0

與其他答案一樣,不要在模板中處理ng-if? – Aaron

+0

@aaron在ddo中,還是html? – alphapilgrim

+0

HTML。沒有必要將視圖分散在兩個地方:它顯示與否的模型來自模型,它應該由模板IMO來表示。 – Aaron

相關問題