2012-11-16 69 views
8

我正在嘗試爲Twitter Bootstrap Modal製作一個指令angularJS指令。AngularJS模態窗口指令

var demoApp = angular.module('demoApp', []); 

demoApp.controller('DialogDemoCtrl', function AutocompleteDemoCtrl($scope) { 
    $scope.Langs = [ 
     {Id:"1", Name:"ActionScript"}, 
     {Id:"2", Name:"AppleScript"}, 
     {Id:"3", Name:"Asp"}, 
     {Id:"4", Name:"BASIC"}, 
     {Id:"5", Name:"C"}, 
     {Id:"6", Name:"C++"} 
    ]; 

    $scope.confirm = function (id) { 
     console.log(id); 
     var item = $scope.Langs.filter(function (item) { return item.Id == id })[0]; 
     var index = $scope.Langs.indexOf(item); 
     $scope.Langs.splice(index, 1); 
    }; 
}); 

demoApp.directive('modal', function ($compile, $timeout) { 
    var modalTemplate = angular.element("<div id='{{modalId}}' class='modal' style='display:none' tabindex='-1' role='dialog' aria-labelledby='myModalLabel' aria-hidden='true'><div class='modal-header'><h3 id='myModalLabel'>{{modalHeaderText}}</h3></div><div class='modal-body'><p>{{modalBodyText}}</p></div><div class='modal-footer'><a class='{{cancelButtonClass}}' data-dismiss='modal' aria-hidden='true'>{{cancelButtonText}}</a><a ng-click='handler()' class='{{confirmButtonClas}}'>{{confirmButtonText}}</a></div></div>"); 
    var linkTemplate = "<a href='#{{modalId}}' id= role='button' data-toggle='modal' class='btn small_link_button'>{{linkTitle}}</a>" 

    var linker = function (scope, element, attrs) { 
     scope.confirmButtonText = attrs.confirmButtonText; 
     scope.cancelButtonText = attrs.cancelButtonText; 
     scope.modalHeaderText = attrs.modalHeaderText; 
     scope.modalBodyText = attrs.modalBodyText; 
     scope.confirmButtonClass = attrs.confirmButtonClass; 
     scope.cancelButtonClass = attrs.cancelButtonClass; 
     scope.modalId = attrs.modalId; 
     scope.linkTitle = attrs.linkTitle; 

     $compile(element.contents())(scope); 
     var newTemplate = $compile(modalTemplate)(scope); 

     $(newTemplate).appendTo('body'); 

     $("#" + scope.modalId).modal({ 
      backdrop: false, 
      show: false 
     }); 
    } 

    var controller = function ($scope) { 
     $scope.handler = function() { 
      $timeout(function() { 
       $("#"+ $scope.modalId).modal('hide');   
       $scope.confirm();    
      }); 
     } 
    } 

    return { 
     restrict: "E", 
     rep1ace: true, 
     link: linker, 
     controller: controller, 
     template: linkTemplate 
     scope: { 
      confirm: '&' 
     } 
    }; 
});​ 

這裏的jsfiddle例如http://jsfiddle.net/okolobaxa/unyh4/15/

但處理器()函數運行多次,網頁上的指示。爲什麼?什麼是正確的方式?

回答

6

那麼,除非你想重塑這個,否則我認爲已經有一個解決方案。

從AngularUI檢出this。它在沒有twitter引導的情況下運行。

+1

或者這只是使用直通:http://plnkr.co/edit/gist:4464334?p=preview – ProLoser

8

我發現只使用twitter引導模式的方式twitter引導文檔說足以讓他們工作。

我正在使用模式在我的管理頁面上放置用戶編輯表單。我用來啓動它的按鈕具有ng-click屬性,該屬性將用戶ID傳遞給該範圍的一個函數,然後將該函數傳遞給服務。模式的內容綁定到它自己的控制器,該控制器監聽來自服務的更改並更新要顯示在窗體上的值。

所以...... ng-click屬性實際上只是傳遞數據,模態仍然是用數據切換和href標籤觸發的。至於模態本身的內容,這是一個部分。所以,我在頁面上有多個按鈕都會觸發標記中模態的單個實例,並且根據單擊的按鈕,該模式中窗體上的值是不同的。

我會看看我的代碼,看看我是否可以將其中任何一個出來建立一個plnkr演示。

編輯: 我扔在一起說明本質上我用我的應用程序有什麼快速plunker演示:http://embed.plnkr.co/iqVl0Wb57rmKymza7AlI/preview

獎金,它有一些測試,以確保兩個密碼字段匹配(或彰顯他們爲出錯),如果密碼不匹配則禁用提交按鈕,或者對於新用戶,用戶名和密碼字段爲空。當然,保存不會做任何事情,因爲它只是一個演示。

享受。

+0

我試着實現你的代碼,當我點擊按鈕時,什麼也沒有打開...... – guiomie

+0

嗯..有可能是因爲更新版本的Angular和/或Bootstrap引起事情無法正常工作。 –

4

我知道這可能是晚了,但我開始嘗試,爲什麼處理程序得到了多次調用弄清楚作爲練習,我不能停止,直到完成的:P

的原因是隻要你爲每個模式創建的每個div都沒有唯一的id,一旦我確定一切都開始工作。不要問我究竟是什麼原因,可能與$('#'+ scope.modalId).modal()調用有關。

就好像我應該張貼我發現如果有人試圖弄清楚這一點:)