当前位置: 首页 > 面试题库 >

AngularJS-如何用变量渲染部分?

太叔富
2023-03-14
问题内容

例如,我在中有一个局部car-list.html,我想在几个地方使用不同的汽车集合来渲染它。也许是这样的:

<h1>All New Cars</h1>
<div ng-include="car-list.html" ng-data-cars="allCars | onlyNew"></div>

<h1>All Toyotas</h1>
<div ng-include="car-list.html" ng-data-cars="allCars | make:toyota"></div>

与常规包含项的主要区别在于,部分显示项不需要了解其要显示的汽车列表的任何信息。给了它一系列汽车,并显示它们。可能像:

<!-- car-list.html -->
<div ng-repeat="car in cars" ng-controller="CarListControl">
    {{car.year}} {{car.make}} {{car.model}}
</div>

问题答案:

该指令在父作用域和子作用域中重命名的“本地”变量之间提供了2路数据绑定。它可以与其他指令结合使用,例如ng- include实现出色的模板可重用性。需要AngularJS 1.2.x

标记

<div with-locals locals-cars="allCars | onlyNew"></div>

这是怎么回事:

  • 这基本上是ngInclude指令的扩展,允许您从父范围传递 重命名的 变量。ngInclude完全不需要,但是此指令已设计为可以很好地使用它。
  • 您可以附加任意数量的locals-*属性,所有这些属性都将 作为Angular表达式 进行解析和监视。
    • 这些表达式可用于作为$scope.locals对象属性附加的部分。
    • 在上面的示例中,locals-cars="..."定义了一个表达式,该表达式可以用作$scope.locals.cars
    • 类似于data-cars="..."使用jQuery通过jQuery使用属性的方式.data().cars

指令

编辑 我已经重构为利用(独立于)本机ngInclude指令,并将某些计算移至编译函数中以提高效率。

angular.module('withLocals', [])
.directive('withLocals', function($parse) {
    return {
        scope: true,
        compile: function(element, attributes, transclusion) {
            // for each attribute that matches locals-* (camelcased to locals[A-Z0-9]),
            // capture the "key" intended for the local variable so that we can later
            // map it into $scope.locals (in the linking function below)
            var mapLocalsToParentExp = {};
            for (attr in attributes) {
                if (attributes.hasOwnProperty(attr) && /^locals[A-Z0-9]/.test(attr)) {
                    var localKey = attr.slice(6);
                    localKey = localKey[0].toLowerCase() + localKey.slice(1);

                    mapLocalsToParentExp[localKey] = attributes[attr];
                }
            }

            var updateParentValueFunction = function($scope, localKey) {
                // Find the $parent scope that initialized this directive.
                // Important in cases where controllers have caused this $scope to be deeply nested inside the original parent
                var $parent = $scope.$parent;
                while (!$parent.hasOwnProperty(mapLocalsToParentExp[localKey])) {
                    $parent = $parent.$parent;
                }

                return function(newValue) {
                    $parse(mapLocalsToParentExp[localKey]).assign($parent, newValue);
                }
            };

            return {
                pre: function($scope, $element, $attributes) {

                    // setup `$scope.locals` hash so that we can map expressions
                    // from the parent scope into it.
                    $scope.locals = {};
                    for (localKey in mapLocalsToParentExp) {

                        // For each local key, $watch the provided expression and update
                        // the $scope.locals hash (i.e. attribute `locals-cars` has key
                        // `cars` and the $watch()ed value maps to `$scope.locals.cars`)
                        $scope.$watch(
                            mapLocalsToParentExp[localKey],
                            function(localKey) {
                                return function(newValue, oldValue) {
                                    $scope.locals[localKey] = newValue;
                                };
                            }(localKey),
                            true
                        );

                        // Also watch the local value and propagate any changes
                        // back up to the parent scope.
                        var parsedGetter = $parse(mapLocalsToParentExp[localKey]);
                        if (parsedGetter.assign) {
                            $scope.$watch('locals.'+localKey, updateParentValueFunction($scope, localKey));
                        }

                    }
                }
            };
        }
    };
});


 类似资料:
  • 问题内容: 渲染模板后如何运行方法?我要设置和之后,我需要使用JQuery进行更改(例如,在模板内容的DOM中)。正在“之前”渲染工作(模板的DOM尚不可用)。谢谢。 问题答案: 创建在链接函数中运行代码的指令。构建模板后,将调用链接功能。 请参阅ng-click以获取想法。

  • 问题内容: 我知道如何在AngularJS中创建 视图 条件,该条件将根据条件显示或隐藏dom元素: 但是如何创建确定是否渲染div 的 渲染 条件? 问题答案: 针对angularjs 1.1.5及更高版本用户的更新(在1.0.7中不受支持): 相关提交:https : //github.com/angular/angular.js/commit/2f96fbd17577685bc013a4f7

  • 问题内容: 我有一些文本存储在包含一些HTML的变量中。例如,帽子中的猫。但是,当我在Jade中渲染它时,它与标签一起显示,而不是渲染格式。我怎样才能解决这个问题? 问题答案: 为了安全起见,默认情况下,转义由=缓冲的代码是转义的,但是要输出未转义的返回值,您可以使用!= 帕格博士

  • 问题内容: 我有一个应用程序,该应用程序具有一组具有递归关系的数据(使用递归的树状视图。)我尝试了几种通过Angular实现此关系的方法,但似乎都没有一种可行的结果。 这里的想法是,我希望使用一组嵌套列表来呈现此数据,以允许许多(7+)深度级别。为了简化操作(我的实际应用程序使用Restangular),我构建了以下插件: http://plnkr.co/edit/dKT9OvpsMgnxmLwg

  • 问题内容: 我知道烧瓶的功能。我必须提供模板的文件名。但是现在我想呈现模板的字符串(即模板的内容)。那讲得通。但我现在不想解释原因。如何简单地渲染模板的文本? 问题答案: 你可以使用:

  • 问题内容: 我检查了这个问题,它解决了我的最初问题。但是我不希望仅当用户单击链接时才显示部分视图,我希望在页面加载时显示部分视图,并且可能在加载部分视图时显示进度指示器。 如何实现? 非常感谢您阅读本文。 问题答案: 如果要加载页面,然后通过ajax加载部分视图,则可以创建一个执行以下操作的对象: 然后在您的页面中执行以下操作: