0

templateUrl在我的角度指令中使用时,我遇到了一些奇怪的行为。

基本上,当我提供时,templateUrl我似乎无法从链接函数或指令控制器访问评估的属性。链接函数只返回未计算的表达式(例如{{input.text}}),控制器获取undefined.

使用 fiddle 演示比解释更容易,所以我在这里创建了一个非常简单的示例。打开控制台并记下输出,然后注释掉templateUrl属性并重新运行小提琴以查看差异。template请注意,如果您将模板移出缓存并移入属性,则不会发生这种情况。有人可以解释是什么提供了templateUrl导致这种行为的变化吗?

为了完整起见,这里是代码:

HTML:

<div ng-controller="MyCtrl">
    Text1<input ng-model="input.text"/>
    <div d-nested="" d-attr2="{{input.text}}"></div>
</div>

JS:

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

function MyCtrl($scope) {
    $scope.input = {};
    $scope.input.text = "some string";
}

myApp.run(['$templateCache', function($templateCache) {
  return $templateCache.put('/partials/rhombus.html', 
                            '<span>Just a template.</span>');

myApp.directive('dNested', function(){
    return {
        transclude: false,
        //Comment out the below line to observe the difference.
        templateUrl: '/partials/rhombus.html',
        replace: false,
        controller: function($attrs, $scope){
            this.logAttr = function(){
                console.log("from controller: " + $attrs.dAttr2);
            }
        },
        link: function(scope, element, attrs, ctrl){
            attrs.$observe('dAttr2', function(val){
                console.log("from link function: " + val);
                ctrl.logAttr();               
            });
        }
    }
});

更新

在下面的 Martin 给出了一个有用的回答之后,我看到它现在可以工作了,但是当指令嵌套时(即一个被嵌入到另一个指令中)就不行了。在此处查看更新的小提琴。您仍然会注意到注释掉模板 url 将导致正确的行为。

4

1 回答 1

1

这似乎是您正在使用的 Angular 版本中的一个错误(小提琴使用 1.0.1)。如果升级到 1.0.5 或更高版本,它可以正常工作。

于 2013-10-14T13:57:44.547 回答