AngularJS - หลายมุมมองในเทมเพลตเดียว


132

ฉันกำลังสร้างเว็บแอปแบบไดนามิกโดยใช้ AngularJS เป็นไปได้ไหมที่จะมีหลายng-viewเทมเพลตในเทมเพลตเดียว


2
ดูเหมือนว่าจะมีคำขอดึง แต่ยังคงมีข้อบกพร่องอยู่: github.com/angular/angular.js/pull/1198
Alp

4
Jan Varwig เขียนเกี่ยวกับบทบาทของคำสั่งใน Angular ไม่ใช่คำตอบสำหรับคำถามของคุณ แต่สำหรับบางกรณีความคิดของเขาอาจเป็นทางเลือกที่ดี: jan.varwig.org/archive/angularjs-views-vs-directives/…
Juha Palomäki

กำลังอ่านบทช่วยสอนเชิงมุมและมีคำถามเดียวกันนี้พวกเขาไม่ได้ให้ความชัดเจนมากนักดูเหมือนว่าจะเป็นแนวคิดที่ค่อนข้างลึก แต่ ..
qwwqwwq

คำตอบ:


100

คุณสามารถมีเพียงหนึ่ง ng-viewคุณสามารถมีเพียงหนึ่ง

คุณสามารถเปลี่ยนเนื้อหาในหลายวิธี: ng-include, ng-switchหรือควบคุมการทำแผนที่ที่แตกต่างกันและแม่แบบผ่าน routeProvider


1
ตัวควบคุมและเทมเพลตการทำแผนที่จะแทนที่องค์ประกอบ ng-view ทั้งหมดใช่ไหม
zx1986

9
สิ่งที่เกี่ยวกับการเปลี่ยนแปลงเนื้อหาของวิดเจ็ตแบบไดนามิก? คุณไม่ต้องการสร้างมุมมองสำหรับวิดเจ็ตและคอนโทรลเลอร์สำหรับวิดเจ็ตและโมเดลสำหรับวิดเจ็ตหรือไม่?
Ray Suelzer

แนะนำให้ใช้มุมมองหรือไม่? การกำหนด div ด้วยng-showและng-hideและเพื่อควบคุมการมองเห็นโดยใช้ตัวแปรไม่ดีกว่าหรือ? เพราะบางครั้งฉันอาจต้องการซ่อน / แสดงส่วนประกอบหลาย
อย่าง

39

UI-Routerเป็นโครงการที่สามารถช่วยได้: https://github.com/angular-ui/ui-router หนึ่งในคุณสมบัติของมันคือมุมมองหลายชื่อ

UI-Router มีคุณสมบัติมากมายและฉันขอแนะนำให้คุณใช้หากคุณกำลังทำงานกับแอพขั้นสูง

ตรวจสอบเอกสารของหลายชื่อชมที่นี่


6
น่าเสียดายที่ ui-router readme กล่าวว่า: หมายเหตุ: UI-Router อยู่ระหว่างการพัฒนา ด้วยเหตุนี้ในขณะที่ไลบรารีนี้ได้รับการทดสอบอย่างดี API อาจเปลี่ยนแปลงได้ พิจารณาใช้ในแอปพลิเคชันการผลิตเฉพาะในกรณีที่คุณสะดวกที่จะติดตามการเปลี่ยนแปลงและอัปเดตการใช้งานของคุณตามนั้น
trainoasis

1
@trainoasis ใช้สำหรับหลายโครงการดูเหมือนว่า 'เสถียร' มากและจนถึงตอนนี้ฉันไม่มีปัญหาเกี่ยวกับการเปลี่ยน API อันที่จริงฉันจำการเปลี่ยนแปลงที่สำคัญใน API ไม่ได้
Morteza Ziyae

19

ng-viewผมเชื่อว่าคุณสามารถทำได้โดยเพียงแค่มีเพียงครั้งเดียว ในเทมเพลตหลักคุณสามารถมีng-includeส่วนสำหรับมุมมองย่อยจากนั้นในตัวควบคุมหลักกำหนดคุณสมบัติของโมเดลสำหรับแต่ละเทมเพลตย่อย เพื่อที่จะผูกกับng-includeส่วนต่างๆโดยอัตโนมัติ เช่นเดียวกับการมีหลาย ๆng-view

คุณสามารถตรวจสอบตัวอย่างที่ระบุในng-include เอกสารประกอบ

ในตัวอย่างเมื่อคุณเปลี่ยนเทมเพลตจากรายการแบบเลื่อนลงมันจะเปลี่ยนเนื้อหา ที่นี่สมมติว่าคุณมีหนึ่งหลักng-viewและแทนที่จะเลือกเนื้อหาย่อยด้วยตนเองโดยการเลือกแบบเลื่อนลงคุณจะทำเช่นเดียวกับเมื่อโหลดมุมมองหลัก


2
ในกรณีที่ไม่มีโซลูชันเช่น UI-Router ng-include เป็นทางเลือกที่ใช้ได้จริงตามที่คุณได้อธิบายไว้ สิ่งที่ ng-include ไม่สามารถทำได้คือ URL (สถานะ) ที่ขับเคลื่อนด้วยหลายมุมมอง $ route ไม่สามารถแสดงมุมมองที่แตกต่างกันแบบไดนามิกตาม URL ปัจจุบัน เราสามารถบิดแขนของ Angular และทำให้เกิดขึ้นได้โดยใช้ลอจิกที่กำหนดเองในคอนโทรลเลอร์เช่นเดียวกับตัวอย่างในng-include เอกสารประกอบแต่รูปแบบสถาปัตยกรรมแอปพลิเคชันไม่เป็นที่ต้องการ UI-Router เป็นโซลูชันที่เหมาะสม
Yiling

หนึ่งบวกสำหรับความคิดเห็น @Yiling การใช้ ng-include เป็นวิธีแก้ปัญหาชั่วคราว
Farshid Saberi

13

การใช้ng-viewโมดูลปกติคุณไม่สามารถมีเทมเพลตไดนามิกมากกว่าหนึ่งเทมเพลต

อย่างไรก็ตามโครงการนี้ช่วยให้คุณสามารถทำได้ (มองหาui-router)


3
angular-ui ดูเหมือนจะเป็นทางเลือกที่ดีในอนาคต (อันใกล้) แต่ดูเหมือนว่าจะไม่เสถียรสำหรับการใช้งานจริง
David Barreto

8

เป็นไปได้ที่จะมีหลายมุมมองหรือซ้อนกัน แต่ไม่ใช่โดย ng-view

โมดูลการกำหนดเส้นทางหลักในเชิงมุมไม่รองรับหลายมุมมอง แต่คุณสามารถใช้ ui-router นี้เป็นโมดูลของบุคคลที่สามซึ่งคุณจะได้รับผ่านทาง Github เชิงมุม-UI / UI-เราเตอร์https://github.com/angular-ui/ui-router นอกจากนี้ยังมีการพัฒนา ngRouter (ngNewRouter) เวอร์ชันใหม่ มันไม่คงที่ในขณะนี้ ดังนั้นฉันจึงให้ตัวอย่างการเริ่มต้นง่ายๆด้วย ui-router คุณสามารถตั้งชื่อมุมมองและระบุได้ว่าควรใช้เทมเพลตและคอนโทรลเลอร์ใดในการแสดงผล การใช้ $ stateProvider คุณควรระบุวิธีการแสดงผลตัวยึดตำแหน่งสำหรับสถานะเฉพาะ

<body ng-app="main">
    <script type="text/javascript">
    angular.module('main', ['ui.router'])
    .config(['$locationProvider', '$stateProvider', function ($locationProvider, $stateProvider) {
        $stateProvider
        .state('home', {
            url: '/',
            views: {
                'header': {
                    templateUrl: '/app/header.html'
                },
                'content': {
                    templateUrl: '/app/content.html'
                }
            }
        });
    }]);
    </script>
    <a ui-sref="home">home</a>
    <div ui-view="header">header</div>
    <div ui-view="content">content</div>
    <div ui-view="bottom">footer</div>
    <script src="bower_components/angular/angular.js"></script>
    <script src="bower_components/angular-ui-router/release/angular-ui-router.js">
</body>

คุณต้องอ้างอิง angularjs และ angular-ui.router สำหรับตัวอย่างนี้

$ bower install angular-ui-router

ขอบคุณ Farshid นี่เยี่ยมมาก! มันควรจะกล่าวถึงในที่เก็บ Github เชิงมุม - ui / ui-router Github github.com/angular-ui/ui-routerที่ฉันได้รับโมดูล
สิ้นเชิงน่าอัศจรรย์

ฉันไม่แน่ใจว่าทำไมคุณต้องทำเช่นนั้น ทำไมไม่รวมส่วนหัว / ส่วนท้ายและ ng-view เนื้อหา?
user441521

ng-include จะใช้งานได้หากไฟล์นั้นถูกโฮสต์เช่น บน nodejs หากทำงานกับไดเร็กทอรีภายในระบบจะทำให้เกิดข้อผิดพลาดข้ามโดเมน
Sid

0

คุณไม่สามารถมีหลายมุมมอง ด้านล่างนี้คือกรณีการใช้งานของฉันที่ฉันแก้ไขข้อกำหนด ฉันต้องการมีพฤติกรรมแบบแท็บในกล่องโต้ตอบโมเดลของฉัน ฉันประสบปัญหาเมื่อคลิกที่แท็บที่มีไฮเปอร์ลิงก์ซึ่งจะเรียกลิงก์เราเตอร์ ฉันแก้ไขสิ่งนี้โดยใช้ปุ่มและ css สำหรับแท็บ เมื่อผู้ใช้คลิกที่แท็บมันจะไม่เรียกไฮเปอร์ลิงก์ใด ๆ ซึ่งจะเรียกใช้ ng-router เสมอ เมื่อผู้ใช้คลิกที่แท็บมันจะเรียกเมธอดโดยที่ฉันโหลด html แบบไดนามิก ด้านล่างนี้คือฟังก์ชั่นเมื่อคลิกที่แท็บ

self.submit = function(form) {
                $templateRequest('resources/items/employee/test_template.html').then(function(template){
                var compiledeHTML = $compile(template)($scope);
                $("#d").replaceWith(compiledeHTML);
});

ผู้ใช้ $ templateRequest ในหน้า test_template.html เพิ่มเนื้อหา html ของคุณ เนื้อหา html นี้จะเชื่อมโยงกับคอนโทรลเลอร์ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.