【问题标题】:Using dynamic layouts from json response: angularJS使用来自 json 响应的动态布局:angularJS
【发布时间】:2014-10-14 21:54:26
【问题描述】:

在我的网络应用中,在搜索结果中,每个项目都可以根据项目的类型具有不同的外观。为了实现这一点,我正在考虑在 json 响应中包含该特定项目的数据占位符的布局。如何将范围数据绑定到 json 响应模板中的占位符?

例如。 我的搜索结果看起来像:

<li ng-repeat="item in items">
<div ng-bind-html="item.template"></div>
</li>

JSON 响应如下所示:

[{
"template_name":"One",
"template":"<div ng-repeat='subitem in item.subitems'>{{subitem.name}}</div>",
"subitems":[{name:"John"},{name:"Jane"}]
},
{
"template_name":"Two",
"template":"<div ng-repeat='subitem in item.subitems'>{{subitem.name}}</div>",
"subitems":[{name:"John"},{name:"Jane"}]
}
]

如您所见,我需要将 json 响应中的占位符与范围数据绑定。有什么办法吗?如果不是,你建议我应该如何解决这种情况?

谢谢!

【问题讨论】:

  • 通过模板缓存为类型添加模板,那么您的解决方案只需要知道类型 X 映射到模板 Y。您的 JSON data 响应不需要参与其中。
  • 我的模板需要在服务器中动态构建。这就是为什么我不能选择本地存储的模板。
  • 它们需要在获取数据时构建?这没有任何意义。您可以根据需要动态构建它们,然后将它们添加到模板缓存中 - 例如见stackoverflow.com/questions/12346690/…
  • 好吧。是的。我知道这听起来很荒谬。但情况就是这样。它是一个搜索结果页面。根据结果​​项的类型,每个结果项可能看起来不同。因此,在我阅读单个项目之前,无法知道要使用哪个模板。这就是为什么我决定用 json 响应发送模板数据。

标签: javascript json angularjs layout


【解决方案1】:

虽然这显然行不通:

<li ng-repeat="item in items">
  <div ng-bind-html="item.template"></div>
</li>

既然您告诉 angular 显示位于 item.template 内的 html,但您真正想要的是告诉它处理 item.template,因为它应该以类似于 template 内的方式解析的标记指示。

但是,您可以做的是定义自定义指令,以所需的方式处理item.template。例如:

<li ng-repeat="item in items">
  <div dynamic-template="item.template" />
</li>

其中dynamic-template定义如下:

 module.directive('dynamicTemplate', function($compile){
    return {
      scope: {
        dynamicTemplate:'='
      },
      replace:true,
      transclude: true,
      link: function($scope, $element, $attrs, _, $transcludeFn){
        // since we have isolate scope - transclude the element so it has access 
        // to item and anything else available inside ng-repeat
        $transcludeFn(function($childElement, $childScope){ 
          var link = $compile($scope.dynamicTemplate);
          var bound = link($childScope);
          $element.append(bound);
        });
      }
    };
  });

当然这并不理想,因为对item.template 的更改不会反映,但您可以通过添加$watch 轻松扩展它。

您可以找到工作示例here

【讨论】:

  • 嗨。非常感谢您的回答。它工作得很好。但是,我不完全理解这是如何工作的。你能指导我看一篇文章或其他内容吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多