当前位置: 首页 > 知识库问答 >
问题:

AngularJS:ng-repeat不会检测到范围的变化

张卓
2023-03-14

我一直在阅读各种帖子、问题、答案和文档,但到目前为止还没有解决我的问题。

我正在使用mbExtruder jQuery插件,为了将其集成到angular中,我为它创建了一个指令:

directive('mbExtruder', function($compile) {
            return {
                restrict : 'A',
                link : function(scope, element, attrs) {
                    var mbExtruderConfigurationAttrs = scope.$eval(attrs.mbExtruder);
                    mbExtruderConfigurationAttrs.onExtContentLoad = function() {
                        var templateElement = angular.element(angular.element(element.children()[0]).children()[0]);
                        var clonedElement = $compile(templateElement)(scope);                       
                        scope.$apply();
                        var contentElement = angular.element(angular.element(angular.element(element.children()[0]).children()[0]).children()[0]);
                        contentElement.replaceWith(clonedElement.html());
                    };
                    element.buildMbExtruder(mbExtruderConfigurationAttrs);
                    $.fn.changeLabel = function(text) {
                        $(this).find(".flapLabel").html(text);
                        $(this).find(".flapLabel").mbFlipText();
                    };

我正在提取容器div,编译它,应用scope并用转换后的div替换原来的div。

现在,我使用mbExtruder的功能从单独的HTML文件加载内容,如下所示:

<div>
<ul>    
    <li ng-repeat="property in properties">
        <span><img ng-src="../app/img/{{property.attributes['leadimage']}}"/></span>
        <a ng-click="openDetails(property)">{{property.attributtes['summary']}}</a>
    </li>
    <div ng-hide="properties.length">No data</div>
</ul>
</div>

在视图的HTML中,我有以下内容:

<div id="extruderRight"
        mb-extruder="{position: 'right', width: 300, positionFixed: false, extruderOpacity: .8, textOrientation: 'tb'}"
        class="{title:'Lista', url:'partials/listGrid.html'}">
    </div>

我在指令中得到的范围是实际处理属性数组的父控制器的范围。问题是,如果属性列表预先填充了一些数据,那么最终会以编译后的超文本标记语言结束-酷。但是,对属性的任何更改实际上都没有任何作用。我在指令中的属性上添加了监视处理程序,实际上,每当对属性进行任何更改时都会触发该处理程序,但是,ng-重复不会选择它。最初的想法是让属性列表在开始时为空——这导致ng-重复编译只有这个输出:

<!-- ngRepeat: property in properties -->

这样做有问题吗?ng-repeat声明事实上已经从DOM中消失了。

我是不是遗漏了一些明显的东西?我已经阅读了$编译和ng重复的留档,我会说我不需要自己操作DOM,ng重复应该做它的工作。还是我完全错了?

谢谢

编辑:Plunker

共有1个答案

倪棋
2023-03-14

你要进来了

contentElement.replaceWith(clonedElement.html());

请注意,您实际上是用原始HTML字符串代码替换它。因此,Angular对代码中的指令没有概念。然而,我完全不明白为什么需要这样做。只需编译并将结果附加到范围中似乎就可以了:

var templateElement = angular.element(angular.element(element.children()[0]).children()[0]);
$compile(templateElement)(scope);

这是更新的工作版本:

http://plnkr.co/edit/gxPAP43sx3QxyFzBitd5?p=preview

$compile的文档没有说太多,但是$compile返回了一个函数,然后你用你想要附加元素的作用域来调用它(就我所理解的而言)。因此,您根本不需要存储对该元素的引用,除非您以后想要使用它。

 类似资料:
  • 问题内容: 我正在尝试使用ng-repeat生成表单输入。注意:’customFields’是字段名称的数组:[“ Age”,“ Weight”,“ Ethnicity”]。 设置“ ng-model”的最佳/正确方法是什么?我想将它作为 person.customfields.’fieldname’ 发送到服务器,其中fieldname来自’customFields中的field’。 问题答案:

  • 我试图从它的源代码构建斐济软件code.here的github页面:斐济源代码我开始使用ubuntu终端的maven构建项目,我面临这个错误:

  • 我正在与Maven合作,在编译和构建项目时遇到错误。评估一些pmml文件是jpmml项目。现在我发现了这个错误: 规则0:org.apache.maven.plugins.enforcer.要求MavenVersion失败,消息:检测到的Maven版本:3.0.5不在允许的范围3.2内。 检查链接以查看图像:https://www.dropbox.com/s/3r9d8g8l4r1zctp/mav

  • 问题内容: 我有一个简单的ng-repeat抛出数据,它显示的字段之一是NumberOfStamps: 输出示例: 我如何修改此ng-repeat以仅显示NumberOfStams> 0的记录?我试过了: 预期产量: 问题答案: 在相关范围内创建谓词函数: 作为第一个参数,它在对象上采用属性名称。第二个参数是整数值。 像这样在您的视图中使用它: 演示版

  • HttpSession 对象必须被限定在应用(或 servlet 上下文)级别。底层的机制,如使用 cookie 建立会话,不同的上下文可以是相同,但所引用的对象,包括该对象中的属性,决不能在容器上下文之间共享。 用一个例子来说明该要求: 如果 servlet 使用 RequestDispatcher 来调用另一个 Web 应用的 servlet,任何创建的会话和被调用 servlet 所见的必须

  • 本章介绍当模板在访问变量时发生了什么事情,还有变量是如何存储的。 当调用 Template.process 方法时,它会在方法内部创建一个 Environment 对象,在 process 返回之前一直使用。 该对象存储模板执行时的运行状态信息。除了这些,它还存储由模板中指令,如 assign, macro, local 或 global 创建的变量。 它不会尝试修改传递给 process 的数据