2013-07-05 214 views
1

我想用ui-bootstrap modal制作一个可重用的指令。如何将对象传递给angularjs中的指令模板?

它除了选择

在这里工作几乎是指令:

directive('update', function() { 
return { 
    restrict: "E", 
    templateUrl: "tplModal.html", 
    scope: { 
    selected:"=" 
    }, 
    link: function(scope, elm, attr){ 
    scope.open = function (obj) { 
     scope.shouldBeOpen = true; 
    }; 

    scope.close = function() { 
     scope.shouldBeOpen = false; 
    }; 

    scope.opts = { 
     backdropFade: true, 
     dialogFade:true 
    }; 
    } 
} 

})

和tplModal.html

<button class='btn' ng-click='open(selected)'>Update</button> 
    <div modal="shouldBeOpen" close="close()" options="opts"> 
     <div class="modal-header"> 
      <h3><i class="lead" icon="{{selected.type}}"></i> {{selected.name}}</h3> 
     </div> 
     <div class="modal-body"> 
      <!-- stuffs here --> 
     </div> 
     <div class="modal-footer"> 
      <button class="btn btn-warning cancel" ng-click="close()">Cancel</button> 
     </div> 
    </div> 

尽管scope.opts,没有淡化效果。

这里是整个代码: http://plnkr.co/edit/Ab4BOH?p=preview

我到底做错了什么?

+0

后这里的代码,告诉你如何使用该指令,告诉你所期望的代码做什么,以及它做了什么。 –

+0

我更新了问题 –

+0

你的plunk不起作用,我得到了“Plunk not found”错误。 –

回答

0

的问题是,你在opts属性添加到范围后联功能,这将后模态指令的链接函数调用,所以模态指令将永远不会得到这些选项。

的解决方案是将scope.opts = ...预连接功能

directive('update', function() { 
    return { 
     ... 
     compile: function() { 
      return { 
       pre: function(scope, elm, attr){ 
        ... 
        scope.opts = { 
         backdropFade: true, 
         dialogFade: true 
        }; 
       } 
      }; 
     } 
    } 
} 

http://plnkr.co/edit/iZaEiM?p=preview

+0

非常感谢!在过去的几个小时里,我一直在颠倒这个问题,而且我的答案还很遥远。现在,如果我使用模态内的另一个组件(例如,ui-bootstrap datepicker或ngUpload),我应该把相关函数放在这个预链接函数中吗? –

+0

@desgnl你可以但你不必把函数放在预先链接函数中,它实际上取决于你的函数何时被调用。如果函数稍后会被调用,例如事件处理程序,那么在后链接函数中定义它们是安全的。 –

相关问题