【问题标题】:angular code not working in dynamically generated content角度代码在动态生成的内容中不起作用
【发布时间】:2016-04-08 11:07:17
【问题描述】:

我知道我以前也发生过这种情况,但并非完全以这种方式发生,而且我在进行必要的更改时遇到了麻烦。

我有一个 div,它一开始是空的,并且作为画廊的一部分被隐藏。当我单击图像时,它会填充 div 并显示它。除了图像/内容,还有一些导航元素。问题是,这些也是动态生成的,并且由于角度需要重新编译而无法正常工作。这是填充的函数:

    $scope.picturePop = function(picID){
    match = $.grep($scope.gallery, function(obj) { return obj.id == picID; });
    pic = match[0].image;
    title = match[0].title;
    desc = match[0].desc;
    closediv = "<div id=\"divClose\" class=\"floatRight\" ng-click=\"closeParent();\">Close</div>";
    navDiv = "";
    if(picID > 1){
        prev = picID - 1;
        navDiv += "<div id=\"picNav\" ng-click=\"picturePop(" + prev + ")\">Previous</div>";
    }

    if(picID < $scope.picCount){
        next = picID + 1;
        navDiv += "<div id=\"picNav\" ng-click=\"picturePop(" + next + ");\">Next</div>";
    }

    $('#innerPictureDisplay').html(closediv + "<br/><br/><img src=\"images/paintings/" + pic + "\" /><p><b>" + title + "</b><\p><p>" + desc + "</p>"+ navDiv);
    $('#outerPictureDisplay').css('display','block');
};

如何使该代码“重新编译”以使“关闭”和导航项正常工作?

更新

所以,我改变了我的方法,但我显然仍然缺少一些东西:

我的新 HTML:

        <div id="outerPictureDisplay" ng-show="picID > 0">
        <div id="innerPictureDisplay">
        <div id="divClose" class="floatRight" ng-click="picID = 0;">Close</div>
        <div id="picNav" ng-click="picturePop({{prevID}});" ng-show="picID > 1">Previous</div>
        <div id="picNav" ng-click="picturePop({{nextID}});" ng-show="picID < picCount">Next</div>
        <img src="images/paintings/{{thisPic.image}}" />
        <p>
        <b>{{thisPic.title}}</b>
        </p>
        <p>{{thisPic.desc}}</p>
        </div>
    </div>

我的新功能:

    $scope.picturePop = function(picID){
        match = $.grep($scope.gallery, function(obj) { return obj.id == picID; });
        $scope.thisPic = match[0];
        $scope.picID = picID;
        $scope.nextID = picID + 1;
        $scope.prevID = picID - 1;
        var $content =  $('#innerPictureDisplay');
        var scope =  $content.scope();
        $compile($content.contents())(scope);
};

当我点击一张图片时,一切正常,但当我点击上一张或下一张时,它会关闭,因为它将 picID 注册为空。我检查了,数字确实打印在代码中,但是 angular 在点击时看不到它们。它们以未定义的形式出现 - 似乎是编译问题。我尝试将其全部实现为指令,即使使用建议的链接,但我必须做一些事情,因为它没有帮助。

【问题讨论】:

  • 你为什么首先使用 jQuery 呢?使用 Angular 方法,让 Angular 从您的数据模型中构建和管理 dom。强烈建议阅读:thinking-in-angularjs-if-i-have-a-jquery-background
  • 一开始你真的在挑战 Angular 的实用性极限。您注入的 html 可以轻松放置在模板中,并使用 ng-show="picID &gt; 1"(例如)显示或隐藏您的导航,使用 ng-src="..." 显示图像本身。
  • 就像我在下面所说的那样,我知道这有点落后。但我只是把这个扔了。不过,我想我会回去重做这个清洁器。谢谢!

标签: angularjs dynamically-generated angularjs-injector


【解决方案1】:

您可以像这样使用角度服务$compile

$compile("<a ng-click='myFunction()'>my html</a>")(scope);

当然,无论您身在何处,都必须给他注射。 无论如何,看在上帝的份上,不要以这种方式使用 DOM 操作。您应该使用指令并从模型中提供内容。

更新 1

我建议使用incunabindHtmlCompile 指令,您可以找到here

【讨论】:

  • 是的,我知道这是一种糟糕的构建方式。我只是为了证明概念而快速抽出它,然后再去清理它。谢谢!
  • 不是不好的方法,而是在 Angular 中重新编译的唯一方法。
  • 你们是对的。我首先需要重新考虑如何展示它。
  • 更新了我的答案(更新 1),那家伙可能会提供一个非常有用的指令。
  • 您的表达式不正确,您应该使用ng-click="picturePop(nextID);",一旦picturePopnextID 都是$scope 成员。因为 ngClick 已经是一个角度指令,所以你不需要使用双胡须。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
相关资源
最近更新 更多