2012-11-16 71 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()调用有关。

就好像我应该张贴我发现如果有人试图弄清楚这一点:)