angularjs如何动态更改模板URL

时间:2015-02-25 11:03:37

标签: javascript angularjs angularjs-directive

我的模块中有一个指令。我想根据属性更改templateUrl

HTML

    <div test stage="dynamicstage"></div>

模块

angular.module('trial', [])
    .controller('trialCtrl', function ($scope) {
        $scope.dynamicstage = 'Welcome';
    })
    .directive('test', function () {
    return {
        restrict: 'A',
        scope: {
            'stage': '='
        },
        link: function (scope, element, attrs) {
            scope.$watch('stage', function(condition){
                if(stage === 'welcome'){
                   templateUrl: "hello.html";
                }else{
                    different template url...
                };
            });
        }
    }
});

这不起作用。 templateurl未加载到div中。我想动态更改templateUrl是可能的。

我感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

这在Angular中不是很透明。 templateUrl可以是动态构建模板URL的函数,但是在您的情况下,您需要一个范围,目前尚未提供URL。

您可以在ngInclude

的帮助下执行此类操作
app.directive('test', function() {
    return {
        restrict: 'A',
        scope: {
            'stage': '='
        },
        template: '<div ng-include="templateUrl"></div>',
        link: function(scope, element, attrs) {
            scope.$watch('stage', function(condition) {
                if (scope.stage === 'Welcome') {
                    scope.templateUrl = "hello.html";
                } else {
                    scope.templateUrl = "other.html";
                };
            });
        }
    }
});

演示: http://plnkr.co/edit/l1IysXubJvMPTIphqPvn?p=preview

答案 1 :(得分:1)

解决方案1:

scope.$watch('stage', function(condition){
    var templateUrl;
    if(stage === 'welcome'){
        templateUrl = "hello.html";
    } else{
        templateUrl = "someothertemplate.html";
    };

    //load the template;
    $http.get(templateUrl)
        .then(function (response) {
            // template is loaded.
            // add it and compile it.
            angular.element(element).html(response.data);
            $compile(element.contents())(scope);
        });
});

<强>溶液2: 使用ng-include

<div test stage="dynamicstage">
    <div ng-include="templateUrl"></div>
</div>

内部指令:

scope.$watch('stage', function(condition){
    var templateUrl;
    if(stage === 'welcome'){
        templateUrl = "hello.html";
    } else{
        templateUrl = "someothertemplate.html";
    };

    scope.$parent.templateUrl = templateUrl; // make sure that templateUrl is updated in proper scope
})