AngularJS ng-bind-html 2way数据绑定

时间:2014-08-20 13:48:16

标签: angularjs angularjs-controller ng-bind-html

我有一个AngularJS应用程序,我从web服务获取一些数据并使用ng-bind-html将一些HTML解析到模板...但是当我尝试在ng-bind-html中绑定数据时 - 没有任何反应。任何人?

我在这里有一个小例子,..不是正确的情况。

HTML

<div ng-controller="MyCtrl">
    <div ng-bind-html="post"></div>
</div>

的Javascript

angular.module('myApp',[])
.controller('MyCtrl', function($scope, $sce) {
    $scope.name = 'World';
    $scope.post = $sce.trustAsHtml("<h1>hello {{name}}</h1>");
});

http://jsfiddle.net/bugd67e3/

2 个答案:

答案 0 :(得分:3)

<强> DEMO

添加此指令

angular.module("myApp").directive('compileTemplate', ["$compile", "$parse", function($compile, $parse) {
    return {
        restrict: 'A',
        link: function($scope, element, attr) {
            var parse = $parse(attr.ngBindHtml);
            function value() { return (parse($scope) || '').toString(); }

            $scope.$watch(value, function() {
                $compile(element, null, -9999)($scope); 
            });
        }
    }
}]);    

答案 1 :(得分:0)

在我的情况下,我有$scope.content从后端动态拉出,延迟1-2秒。如果在CKEDITOR.inline()已初始化后填充内容,则CKEDITOR无法正常工作。我最终得到了以下解决方案,它可以很好地解决2ways数据绑定和加载延迟问题。

<div id="divContent" contenteditable="true" ck-editor ng-model="Content">
</div>


angular.module('ui.ckeditor', []).directive('ckEditor', ["$compile", "$parse", "$sce", function ($compile, $parse, $sce) {
    return {
        require: '?ngModel',
        link: function (scope, elm, attr, ngModel) {
            var hasInit = false;
            scope.$watch(attr.ngModel, function (newValue, oldValue, scope) {
                if (newValue && !hasInit) {
                    hasInit = true;
                    var content = $.parseHTML(newValue.toString());
                    $(elm[0]).append(content);
                    CKEDITOR.inline(elm[0]);
                    elm.on('blur keyup change', function () {
                        scope.$evalAsync(read);
                    });
                }
            })

            // Write data to the model
            function read() {
                var html = elm.html();
                ngModel.$setViewValue($sce.trustAsHtml(html));
            }
        }
    };
}]);