Javascript 指令中的角度条件模板;基于隔离范围变量和承诺的决策

Javascript 指令中的角度条件模板;基于隔离范围变量和承诺的决策,javascript,angularjs,Javascript,Angularjs,基本上,我尝试对地址进行条件格式设置 我做了一个plnkr来可视化简化问题: 指令负责显示正确的模板: app.directive('tqFormatAddress', function(){ return { restrict: 'E', scope: { address:'=' }, link: function (scope, element, attrs) { switch(scope.address.country) {

基本上,我尝试对地址进行条件格式设置

我做了一个plnkr来可视化简化问题:

指令负责显示正确的模板:

app.directive('tqFormatAddress', function(){
  return {
    restrict: 'E',
    scope: {
      address:'='
    },
    link: function (scope, element, attrs) {
      switch(scope.address.country) {
      case "de":
         scope.template = 'adress-de.html';
         break;
      case "uk":
         scope.template = 'adress-uk.html';
         break;
      }
    },
    template: '<ng-include src="template"></ng-include>',
  };
});
他认为:

<tq-format-address address="ansprechpartner.Dienstadresse"></tq-format-address>
然后执行如下操作(未经测试的演示代码):


在没有承诺的情况下,还有别的方法吗?

我会使用
attrs.$observe

像这样:

attrs.$observe('address', function (val) {
  if (val !== undefined) {
    // call your switch function. 
  }
});
这是因为最初您将得到一个未定义的
地址

我找到并更新了你的plunker,看看它是否有帮助(尝试切换
uk
对于address2对象中的
de
,反之亦然,对于address1):


我会使用
attrs.$observe

像这样:

attrs.$observe('address', function (val) {
  if (val !== undefined) {
    // call your switch function. 
  }
});
这是因为最初您将得到一个未定义的
地址

我找到并更新了你的plunker,看看它是否有帮助(尝试切换
uk
对于address2对象中的
de
,反之亦然,对于address1):


我会使用
attrs.$observe

像这样:

attrs.$observe('address', function (val) {
  if (val !== undefined) {
    // call your switch function. 
  }
});
这是因为最初您将得到一个未定义的
地址

我找到并更新了你的plunker,看看它是否有帮助(尝试切换
uk
对于address2对象中的
de
,反之亦然,对于address1):


我会使用
attrs.$observe

像这样:

attrs.$observe('address', function (val) {
  if (val !== undefined) {
    // call your switch function. 
  }
});
这是因为最初您将得到一个未定义的
地址

我找到并更新了你的plunker,看看它是否有帮助(尝试切换
uk
对于address2对象中的
de
,反之亦然,对于address1):


在这种情况下没有理由不使用
ngInclude

如果您不想在自己的目录中使用Promission,可以使用表达式,以便在address对象发生更改时立即更改模板:

app.directive('tqFormatAddress', function(){
  return {
    restrict: 'E',
    scope: {
      address:'='
    },
    link: function (scope, element, attrs) {

      scope.template = function () {
        if (scope.address && scope.address.country)
          return 'adress-' + scope.address.country + '.html';

        return '';
      };
    },
    template: '<ng-include src="template()"></ng-include>',
  };
});
app.directive('tqFormatAddress',function(){
返回{
限制:'E',
范围:{
地址:'='
},
链接:函数(范围、元素、属性){
scope.template=函数(){
if(scope.address&&scope.address.country)
返回'address-'+scope.address.country+'.html';
返回“”;
};
},
模板:“”,
};
});

在这种情况下没有理由不使用
ngInclude

如果您不想在自己的目录中使用Promission,可以使用表达式,以便在address对象发生更改时立即更改模板:

app.directive('tqFormatAddress', function(){
  return {
    restrict: 'E',
    scope: {
      address:'='
    },
    link: function (scope, element, attrs) {

      scope.template = function () {
        if (scope.address && scope.address.country)
          return 'adress-' + scope.address.country + '.html';

        return '';
      };
    },
    template: '<ng-include src="template()"></ng-include>',
  };
});
app.directive('tqFormatAddress',function(){
返回{
限制:'E',
范围:{
地址:'='
},
链接:函数(范围、元素、属性){
scope.template=函数(){
if(scope.address&&scope.address.country)
返回'address-'+scope.address.country+'.html';
返回“”;
};
},
模板:“”,
};
});

在这种情况下没有理由不使用
ngInclude

如果您不想在自己的目录中使用Promission,可以使用表达式,以便在address对象发生更改时立即更改模板:

app.directive('tqFormatAddress', function(){
  return {
    restrict: 'E',
    scope: {
      address:'='
    },
    link: function (scope, element, attrs) {

      scope.template = function () {
        if (scope.address && scope.address.country)
          return 'adress-' + scope.address.country + '.html';

        return '';
      };
    },
    template: '<ng-include src="template()"></ng-include>',
  };
});
app.directive('tqFormatAddress',function(){
返回{
限制:'E',
范围:{
地址:'='
},
链接:函数(范围、元素、属性){
scope.template=函数(){
if(scope.address&&scope.address.country)
返回'address-'+scope.address.country+'.html';
返回“”;
};
},
模板:“”,
};
});

在这种情况下没有理由不使用
ngInclude

如果您不想在自己的目录中使用Promission,可以使用表达式,以便在address对象发生更改时立即更改模板:

app.directive('tqFormatAddress', function(){
  return {
    restrict: 'E',
    scope: {
      address:'='
    },
    link: function (scope, element, attrs) {

      scope.template = function () {
        if (scope.address && scope.address.country)
          return 'adress-' + scope.address.country + '.html';

        return '';
      };
    },
    template: '<ng-include src="template()"></ng-include>',
  };
});
app.directive('tqFormatAddress',function(){
返回{
限制:'E',
范围:{
地址:'='
},
链接:函数(范围、元素、属性){
scope.template=函数(){
if(scope.address&&scope.address.country)
返回'address-'+scope.address.country+'.html';
返回“”;
};
},
模板:“”,
};
});


为什么不想使用$watch?如果我观察到值已经存在,会发生什么情况?@Thomas查看我的答案,以了解
$parse
的正确方法,并为传入属性应用预期行为。当您可以使用
attrs.$observe
时,无需使用
$watch
。“模板”可以是函数,而不是字符串。查看您不想使用$watch的原因的可能重复?如果我查看并且该值已经存在,会发生什么情况?@Thomas查看我的答案,了解
$parse
的正确方法,并为传入属性应用预期行为。当您可以使用
attrs.$observe
时,无需使用
$watch
。“模板”可以是函数,而不是字符串。查看您不想使用$watch的原因的可能重复?如果我查看并且该值已经存在,会发生什么情况?@Thomas查看我的答案,了解
$parse
的正确方法,并为传入属性应用预期行为。当您可以使用
attrs.$observe
时,无需使用
$watch
。“模板”可以是函数,而不是字符串。查看您不想使用$watch的原因的可能重复?如果我查看并且该值已经存在,会发生什么情况?@Thomas查看我的答案,了解
$parse
的正确方法,并为传入属性应用预期行为。当您可以使用
attrs.$observe
时,无需使用
$watch
。“模板”可以是函数,而不是字符串。请看@naeramath7的答案的可能副本,我觉得这个答案更简单。您的解决方案有哪些优点?@Thomas
ng include
创建了一个新范围。我在这方面遇到了麻烦