วิธีสร้างกล่องโต้ตอบใน AngularJS แต่โหลดเฉพาะเนื้อหากล่องโต้ตอบจากเซิร์ฟเวอร์

ฉันรู้ว่าอาจเป็นคำถามง่ายๆ แต่ฉันหงุดหงิดและทำไม่ได้ ฉันยังใหม่กับ AngularJS และฉันกำลังพยายามใช้กล่องโต้ตอบโมดอล (หรือค้นหา) ด้วยเงื่อนไขเหล่านี้:

  1. เนื้อหากล่องโต้ตอบอาจมาจากทุกที่ เช่น เทมเพลตสตริง เทมเพลตสคริปต์ หรือเทมเพลตจาก URL
  2. ชื่อกล่องโต้ตอบและการดำเนินการจะมาจากผู้โทร ไม่ใช่ผู้โทร กล่าวอีกนัยหนึ่ง ขอบเขตหลักจะตัดสินชื่อเรื่องและปุ่มการดำเนินการใดที่ควรมีอยู่ในกล่องโต้ตอบโมดอล (กล่องโต้ตอบหลายรายการที่ฉันพบจะสรุปปุ่มชื่อเรื่องและการดำเนินการในเทมเพลตเอง เช่น อันนี้)
  3. เนื้อหาของเทมเพลตควรเป็นอิสระโดยสิ้นเชิงจากขอบเขตหลัก (ผู้โทร) อันที่จริงมันอาจจะไม่ได้เขียนใน AngularJS ด้วยซ้ำ มันอาจใช้ jQuery
  4. ในกรณีที่เทมเพลตที่โหลดอยู่ใน AngularJS ควรห่อหุ้มคอนโทรลเลอร์ไว้ ตัวอย่างเช่น ng-include ไม่ชอบแท็ก <script>

    มีวิธีแก้ปัญหา (ที่นี่, ที่นี่ และ ที่นี่) แต่แนวคิดในการตกแต่งแท็กสคริปต์ด้วย text/javascript-lazy นั้นมีกลิ่นเหม็นและสกปรกมาก ให้ เพียงอย่างเดียวที่ฉันต้องการให้เนื้อหา HTML นั้นมีอยู่ในตัวเองและสามารถเรียกใช้งานได้ในกรณีที่ไม่ได้โหลดเป็นเนื้อหาของกล่องโต้ตอบโมดอล AngularJS

  5. การสื่อสารระหว่างขอบเขตหลักและเนื้อหาควรทำผ่านสัญญาทั่วไป (เหตุการณ์ JavaScript อยู่ในใจของฉัน)

ฉันได้ลอง ngDialog แล้ว แต่ปัญหาคือคอนเทนเนอร์ควรส่ง controller ไปยังเทมเพลตที่โหลด นั่นไม่ใช่สิ่งที่ฉันต้องการ ในกล่องโต้ตอบ Bootstrap ดูเหมือนว่าคุณจะต้องส่ง controller จากขอบเขตหลักไปยัง เนื้อหาโต้ตอบ สิ่งนี้ทำลายแนวคิดเรื่องการห่อหุ้ม มันไม่พึงปรารถนา นอกจากนี้ยังขึ้นอยู่กับ ผลลัพธ์การโต้ตอบ ซึ่งไม่เป็นที่ต้องการเช่นกัน


person Saeed Neamati    schedule 23.12.2014    source แหล่งที่มา


คำตอบ (1)


ฉันแนะนำให้ใช้ไลบรารี Angular-UI คุณสามารถสร้างกล่องโต้ตอบ a-la "Twitter Bootstrap" ได้อย่างง่ายดาย:

รวม js ไว้ในส่วนหัวของหน้าของคุณ

<script src="/desktop/libs/angular-bootstrap/ui-bootstrap.js"></script>
<script src="/desktop/libs/angular-bootstrap/ui-bootstrap-tpls.js}"></script>

รวมโมดูลในการเริ่มต้นแอป

var Application = A.module('MyApp', [ 'ui.bootstrap', 'ui.bootstrap.modal' ]);

ฉีดตัวควบคุม jour $modal:

(function (A){
    "use strict";
    A.module("MyApp").controller("OpenDlg", [ "$scope", "$modal", function($scope, $modal){
        $scope.openDlg = function(){
            $modal.open({
                controller : 'CategoryAddController',
                templateUrl : '/admindesktop/templates/category/add/'
            }).result.then(function(modalResult){
                console.log(modalResult);
            });
        };
    } ]);
}(this.angular));

ตัวอย่างเช่น เทมเพลตอย่างง่ายสำหรับกล่องโต้ตอบ:

<div class="modal-content">
    <div class="modal-header">
        <h4 class="modal-title text-center">Создание новой категории</h4>
    </div>
    <form class="modal-body form-horizontal" name="categoryForm">
       <div class="form-group">
           <label for="name" class="control-label col-xs-3">Название</label>
           <div class="col-xs-9">
               <input name='name' type="text" class="form-control" ng-model="category.name" maxlength=50 required ng-required="true"/>
           </div>
           <div class="row has-error" ng-show="errors.name">
               <p ng-repeat="error in errors.name">{{ error }}</p>
           </div>          
       </div>
       <div class="container-fluid" ng-show="errors.length > 0">
           <div class="row">
               <p class="text-center text-danger" ng-repeat="error in errors">{{ error }}</p>
           </div>
       </div>      
    </form>
    <div class="modal-footer">
        <button class="btn btn-primary" ng-click="save()" ng-disabled="categoryForm.$invalid">Сохранить</button>
        <button class="btn btn-default" ng-click="cancel()">Отмена</button>
    </div>
</div>

หลัก: ตัวควบคุมสำหรับหน้าต่างโมดอล:

(function(A) {
    "use strict";
    var app = A.module('MyApp');

    app.controller('CategoryAddController', [ '$scope', '$modalInstance', 'Category', 'growl', function($scope, $modalInstance, Category, growl) {

    $scope.save = function() {
        var category = new Category($scope.category);

        category.$save(function() {
            growl.success('Категория успешно создана');
            $modalInstance.close(true);
        }, function(response) {
            $scope.errors = response.data;
        });
    };

    $scope.cancel = function() {
        $modalInstance.close(false);
    };
    } ]);
}(this.angular));

ฉันใช้บริการสำหรับการเปลี่ยนแปลงข้อมูลระหว่างตัวควบคุมโมดอลและขอบเขตหลัก:

(function(A){
    "use strict";
    A.module("MyApp").service('Storage', function(){
        return {
            storedData: undefined
        };
    });
}(this.angular));

ในขอบเขตหลัก:

Storage.storedData = ...; //For example, selected row of table

ในตัวควบคุมโมดอล:

$scope.item = Storage.storedData; //Selected row of table

นอกจากนี้ เชิงมุมยังมีประเภทโมดูลพิเศษ value

person Dunaevsky Maxim    schedule 06.01.2015