【问题标题】:AngularJS directive runtime template changeAngularJS 指令运行时模板更改
【发布时间】:2015-04-29 10:22:04
【问题描述】:

我一直在尝试制作一个输入指令,它允许不同的输入类型(例如间隔(最小-最大)、日期时间、数字、文本...)。非常重要的是,每当用户更改数据的类型时,相应的输入就会更改其模板。我还需要能够在页面上有多个输入(请参阅PLUNKR 以更好地理解)。

经过大量的反复试验和研究,我得出一个结论,我需要观察属性(大输入),根据所选输入类型的值替换我输入的模板,然后编译它。但我无法在编译功能中执行此操作,并且我的手表在链接功能中无法正常工作(我得到 t1,t2)。

所以,我需要做的是,在更改 select(type) 中的值时,更改输入模板(为简单起见,我只是对不同的输入类型进行了颜色编码)。

$scope.$watch('greatInput', function (newVal) {
     console.log(newVal);
     html = getTemplate(newVal);
     $elem.html('').append($compile(html)($scope));
});

这几乎是应该完成工作的函数(根据实现的位置进行了一些更改),但我找不到合适的位置。

完整代码: http://plnkr.co/edit/BCuiqg?p=preview

【问题讨论】:

  • @TechMa9iac 你能详细说明一下吗?我遇到了那个,我在那里找不到我需要的东西。我再次调查了它,这次更深入,但我仍然看不到如何在我的案例中使用接受的答案中的 jsbin。有什么我想念的吗?

标签: javascript angularjs dynamic


【解决方案1】:

到目前为止,最简单的方法是在指令模板中使用ng-ifs 并将输入类型绑定到范围:

.directive("greatInput", function(){
  return {
    template: '<input ng-if="isStr()" type="txt"    ng-model="greatInputModel">\
               <input ng-if="isInt()" type="number" ng-model="greatInputModel">\
               <input ng-if="isDbl()" type="number" ng-model="greatInputModel">',
    scope: {
      greatInputModel: "=",
      greatInputType: "@",
      // etc...
    },
    link: function($scope){
       $scope.isStr = function(){
          return $scope.greatInputType === "5" || someotherCondition();
       }
       // same for $scope.isInt and $scope.isDbl
    }
  }
});

【讨论】:

  • 这是一个超级迟到的答案,但它可能会帮助任何研究它的人。你提供的解决方案是可行的,但我们有一些用于不同输入类型的巨大模板,所以我们最终使用了我问题中的代码。我们遇到的问题是依赖注入。当时,我们对 Angular 还不是很熟悉。我相信我们添加了一个额外的不必要的依赖项,这导致了错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多