【问题标题】:AngularJS & Redactor PluginAngularJS 和 Redactor 插件
【发布时间】:2013-03-18 06:12:32
【问题描述】:

所以我正在使用 AngularJS 开发一个新网站,并且喜欢它!

但是,我遇到了一个问题。 我正在尝试向我的 textarea 添加一个名为“Redactor”的 jQuery 插件,但我认为当我初始化插件时,它会替换 textarea 元素。这是有问题的原因,是因为我为文本区域设置了一个“ng-model”属性,如下所示:

我正在使用 AngularJS UI 来获取焦点事件,然后在文本获得焦点时执行以下代码

    $scope.addRedactor = function() {
        $('.redactor').redactor();
    });

现在我似乎无法获取 textarea 的值,因为当我尝试访问 ng-model 'response' 时,它显示为未定义。

在文本区域受到 Redactor 影响后,有没有办法可以将 ng-model 属性绑定到文本区域?否则,我应该通过其他方式获取 textarea 的值吗?

【问题讨论】:

    标签: jquery angularjs redactor


    【解决方案1】:

    我今天也在寻找同样的答案,并做了一个指令来解决它:

    angular.module('Module', []).directive("redactor", function() {
      return {
        require: '?ngModel',
        link: function($scope, elem, attrs, controller) {   
    
          controller.$render = function() {
    
            elem.redactor({
              keyupCallback: function() {
                $scope.$apply(controller.$setViewValue(elem.getCode()));
              },
              execCommandCallback: function() {
                $scope.$apply(controller.$setViewValue(elem.getCode()));
              }
            });
    
            elem.setCode(controller.$viewValue);
          };
        }
      };
    });
    

    那么你就可以使用下面的 HTML:

    <textarea ng-model="yourModel" redactor></textarea>
    

    模型将在每次 keyUp 以及用户单击工具栏中的按钮时更新。该模型将包含 HTML 代码。

    我刚刚开始使用 AngularJS,所以如果有更好的方法可以做到这一点,或者我是否违反了一些我仍然不知道的约定,请告诉我。

    【讨论】:

    • 我最终使用了相同的解决方案。我会将您的答案标记为正确,以便其他人可以看到解决方案。谢谢!
    • 顺便说一句,对于那些想知道如何将模型输出为解析后的 H​​TML 的人:
      而不是 {{yourModel}}
    • 我收到一个 TypeError: 由于其 html 内容为空,一旦我调用编辑器,就无法调用未定义的方法 'replace'。有没有比在控制器中给它一个值更好的解决方法?
    • 得到相同的 TypeError。为什么会导致这个错误?
    【解决方案2】:

    对于那些发现接受的答案不像我那样工作的人。这是可行的(使用 Angular v1.1.5)

    angular.module('Module', []).directive("redactor", function() {
            return {
                require: '?ngModel',
                link: function($scope, elem, attrs, controller) {
                    controller.$render = function() {
                        elem = $(elem);
                        elem.val(controller.$viewValue);
                        elem.redactor({
    
                            changeCallback: function() {
                                $scope.$apply(controller.$setViewValue(elem.val()));
                            }
    
                        });
    
                    };
                }
            };
        });
    

    changeCallback 比其他回调组合好太多了,就我而言,我必须将 elem 转换为 Jquery 元素。我还发现 setCode 和 getCode 根本不可用。可能是不同的版本。

    【讨论】:

    • 嘿大卫!我实际上仍在研究我的 Redactor 实施,并且最近才更新到新版本。你是对的,getCode 和 setCode 不再存在。你现在可以做的只是在 Redactor 中使用 'this.get()' 或 'this.set()'。
    • 是的,API 已更改。我还注意到changeCallback 似乎在元素接收到值之前被调用,因此在执行elem.val() 时总是落后一个字符。要解决此问题,只需在阅读 elem.val() 之前执行 elem.redactor('sync')
    • 这太完美了,非常感谢。它实际上使用两种方式绑定。
    • @EdgarMartinez 你愿意分享你的指令吗?
    • 初始化后好像无法设置元素的值。
    【解决方案3】:

    将此 AngularJS 模块用于“RedactorJS”: https://github.com/TylerGarlick/angular-redactor

    对我来说效果很好。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多