$ compile不更新动态生成的html运行时

时间:2016-09-27 04:21:27

标签: javascript angularjs angularjs-scope angular-directive-link

这是jsfiddle: https://jsfiddle.net/vikramkute/eq3zpmp9/5/

我是棱角分明的新人。我有一个对象需要在html中附加运行时。我正在使用角1.2.25

预期输出

1 Quest
2 Quest
3 Quest

但我重复了最后一次重复三次。根据我的试验和错误,我觉得问题是$ compile。我尝试了在不同的论坛上提供的不同解决方案但没有任任何帮助非常感谢。感谢。

在指令中(在链接功能内)

            scope.obj =
            [
                {
                    "questionText": "1 Quest"
                },
                {
                    "questionText": "2 Quest"
                },
                {
                    "questionText": "3 Quest"
                }
            ]

            scope.addData = function() {
                for (var i = 0; i < scope.obj.length; i++) {
                    addSlide(scope.obj[i]);
                }
            }

           addSlide = function (obj) {
               scope.singleObj = obj;
               el = $('<div ng-bind="singleObj.questionText"></div>');
               scope.owl.append(el);
               $compile(el)(scope);
           };

输出:

3 Quest
3 Quest
3 Quest

这是完整的指令:

angular.module('journeycarousel', [])
    .directive('journeyCarousel', function ($compile) {
        return {
            restrict: 'E',
            templateUrl: '../components/journeyCarousel/journeyCarousel.html',
            transclude: true,
            link: function (scope, element) {

                scope.obj =
                    [
                        {
                            "questionText": "1 Quest"
                        },
                        {
                            "questionText": "2 Quest"
                        },
                        {
                            "questionText": "3 Quest"
                        }
                    ]

                scope.addData = function() {
                    for (var i = 0; i < scope.obj.length; i++) {
                        addSlide(scope.obj[i]);
                    }
                }

                addSlide = function (obj) {
                    scope.singleObj = obj;
                    el = $('<div ng-bind="singleObj.questionText"></div>');
                    scope.owl.append(el);
                    $compile(el)(scope);
                };
            }
        }
    });

以上代码是简化版。这是实际代码:

    scope.singleObj = obj;
    el = $('<div class="questionContainer" <div ng-repeat="obj in singleObj"> ng-click="onSlideClick($event,singleObj)"> <div class="item"> <div class="questionSection" ng-bind="singleObj.questionText"></div> <div class="answerSection" ng-bind="singleObj.questionAnswer + singleObj.questionUnitOfMeasure"></div> </div> </div>');
   $('.owl-carousel').owlCarousel('add', el).owlCarousel('update');
   $compile(el)(scope);

2 个答案:

答案 0 :(得分:2)

我相信你输出的原因是

3 Quest
3 Quest
3 Quest

因为在你的情况下,只有在for循环执行3次后,摘要循环才会启动。 所以,到第三次迭代结束时

scope.singleObj 

永远是

{
     "questionText": "3 Quest"
}

因此,所有符合要素的元素将始终引用相同的scope.singleObj

摆脱你可以做到的

$scope.singleObj = [];
var addSlide = function(obj, i) {
    $scope.singleObj.push(obj);
    var ele = '<div ng-bind=\"singleObj[' + i + '].questionText"></div>'
    el = $(ele);
    $("#container").append(el);
    $compile(el)($scope);
};

$scope.addData = function() {
    for (var i = 0; i < $scope.newCarouselSlideData.length; i++) {
        addSlide($scope.newCarouselSlideData[i], i);
    }
}

答案 1 :(得分:-1)

使用下面的结构,可能你搞砸了面向对象的概念:

addSlide = function (obj) {
        scope.singleObj = angular.copy(obj);
        el = $('<div ng-bind="singleObj.questionText"></div>');
        scope.owl.append(el);
        $compile(el)(scope);
};