angularjs模板绑定

时间:2014-05-22 07:27:41

标签: javascript angularjs angularjs-directive

我已经开发了一个transclude指令,我将它设置为使用angularjs模板脚本,一切正常,但我仍然无法访问绑定数据。

我的代码:

的index.html

<div side-element="box" title="Links">
                <ul>
                    <li>Link 1</li>
                    <li>Link 2</li>
                </ul>
</div>

<script id="box" type="text/ng-template">
            <div class="side-box">
                <div class="content">
                    <h2 class="header">Box {{ title }}</h2>
                    <span class="content" ng-transclude></span>
                </div>
            </div>
        </script>
        <script id="ad" type="text/ng-template">
            <div class="side-ad">
                <div class="content">
                    <h2 class="header">AD {{ title }}</h2>
                    <span class="content" ng-transclude></span>
                </div>
            </div>
        </script>

app.js:

angular.module('myApp.directives')
  .directive('sideElement', function ($templateCache, $log) {
return {
  scope: {
    title: '@'
  },
  transclude: 'element',
  link: function(scope, element, attrs, ctrl, transclude){
    var template = $templateCache.get(attrs.sideElement);

    var templateElement = angular.element(template);
    $log.info(scope.title);//Output the title i put in the html which is (Links)
    transclude(scope, function(clone){
      element.after(templateElement.append(clone));
    });
  }
};
});

链接函数(....)中的范围取代了正确的标题,但它在html中不起作用:

Box {{title}}

链接1 链接2

我想我错过了一件事,但我无法弄明白,我需要你的帮助来完成这个循环。

提前完成,

1 个答案:

答案 0 :(得分:2)

必须首先编译包含角度绑定表达式的模板元素,然后进行链接。编译阶段准备模板,而链接阶段为您的绑定表达式设置$ watchers。

Demo Here

这是一个应该有效的编译函数:

    .directive('sideElement', function ($templateCache, $compile, $log) {

    return {
      restrict: 'A',
      transclude: true,
      scope:'@',
      compile: function(element, attrs) {
        var template = $templateCache.get(attrs.sideElement);
        var templateElement = angular.element(template);
        element.append(templateElement);
        return function(scope, element, attr, ctrl, transclude) {
          $log.info(scope.title);
        }
      }
    }