在指令的链接部分中使用$ compile是否可以?

时间:2015-12-11 09:24:59

标签: angularjs

我正在使用AngularJS v1.4.1并且我有以下指令。这是我想工作但现在由于某种原因,当我的页面加载时,指令被调用两次。我检查了我能做的一切,但除了指令不再有效之外,我看不到从现在到现在有什么不同。具体而言,它似乎被调用了两次。

app.directive('pagedownAdmin', ['$compile','$timeout', function ($compile, $timeout) {
    var nextId = 0;
    var converter = Markdown.getSanitizingConverter();
    converter.hooks.chain("preBlockGamut", function (text, rbg) {
        return text.replace(/^ {0,3}""" *\n((?:.*?\n)+?) {0,3}""" *$/gm, function (whole, inner) {
            return "<blockquote>" + rbg(inner) + "</blockquote>\n";
        });
    });

    return {
        require: 'ngModel',
        replace: true,
        scope: {
            modal: '=modal'
        },
        template: '<div class="pagedown-bootstrap-editor"></div>',
        link: function (scope, iElement, attrs: any, ngModel) {

            var editorUniqueId;

            if (attrs.id == null) {
                editorUniqueId = nextId++;
            } else {
                editorUniqueId = attrs.id;
            }

            scope.showPagedownButtons = function () {
                document.getElementById("wmd-button-bar-" + editorUniqueId).style.display = 'block';
            };

            var newElement = $compile(
                '<div>' +
                '<div class="wmd-panel">' +


                '<div data-ng-hide="modal.wmdPreview == true" id="wmd-button-bar-' + editorUniqueId + '" style="display:none;"></div>' +

                '<textarea ng-click="showPagedownButtons()" data-ng-hide="modal.wmdPreview == true" class="wmd-input" id="wmd-input-' + editorUniqueId + '">' +
                '</textarea>' +

                '</div>' +

                '<div data-ng-show="modal.wmdPreview == true" id="wmd-preview-' + editorUniqueId + '" class="pagedownPreview wmd-panel wmd-preview"></div>' +

                '</div>')(scope);

            // iElement.html(newElement);
            iElement.append(newElement);

            var hide = function () {
                document.getElementById("wmd-button-bar-" + editorUniqueId).style.display = 'none';
            }

            var editor = new Markdown.Editor(converter, "-" + editorUniqueId, {
                handler: hide
            });

            // var $wmdInput = iElement.find('#wmd-input-' + editorUniqueId);
            var $wmdInput = angular.element(document.getElementById("wmd-input-" + editorUniqueId));



            var init = false;

            editor.hooks.chain("onPreviewRefresh", function () {
                var val = $wmdInput.val();
                if (init && val !== ngModel.$modelValue) {
                    $timeout(function () {
                        scope.$apply(function () {
                            ngModel.$setViewValue(val);
                            ngModel.$render();
                        });
                    });
                }
            });

            ngModel.$formatters.push(function (value) {
                init = true;
                $wmdInput.val(value);
                editor.refreshPreview();
                return value;
            });

            editor.run();
        }
    }
}]);

以下是调用该指令的代码:

 <textarea data-pagedown-admin
                          data-modal="cos"
                          id="contentText"
                          name="contentText"
                          ng-minlength="5"
                          ng-model="cos.content.text"
                          ng-required="true"></textarea>

当我通过在“var editorUniqueId”上放置一个断点来调试指令时,我发现它会在那里进行两次。

有没有人有任何想法可能会发生什么?

1 个答案:

答案 0 :(得分:0)

我过去做过这件事没有问题:

...
2015-12-11 10:43:35,081 | INFO  | ctivemq.server]) | PListStoreImpl                   | 176 - org.apache.activemq.activemq-osgi - 5.12.1 | PListStore:[C:\CAD_JOBS\apache-servicemix-6.1.0\data\amq-broker\amq-broker\tmp_storage] started
2015-12-11 10:43:35,084 | INFO  | ctivemq.server]) | ActiveMQServiceFactory$1         | 161 - org.apache.servicemix.bundles.spring-context - 3.2.14.RELEASE_1 | Publishing application context as OSGi service with properties {org.springframework.context.service.name=org.apache.activemq.activemq-osgi, Bundle-SymbolicName=org.apache.activemq.activemq-osgi, Bundle-Version=5.12.1}
2015-12-11 10:43:35,093 | ERROR | ctivemq.server]) | configadmin                      | 6 - org.apache.felix.configadmin - 1.8.4 | [org.osgi.service.cm.ManagedServiceFactory, id=813, bundle=176/mvn:org.apache.activemq/activemq-osgi/5.12.1]: Updating configuration org.apache.activemq.server.24d13a82-a253-4d1e-8355-bcbf0fff6927 caused a problem: Cannot start the broker
org.osgi.service.cm.ConfigurationException: null : Cannot start the broker
    at org.apache.activemq.osgi.ActiveMQServiceFactory.updated(ActiveMQServiceFactory.java:120)[176:org.apache.activemq.activemq-osgi:5.12.1]
    at Proxye6b76768_a1ce_4232_9f62_ee376293401b.updated(Unknown Source)[:]
    at org.apache.felix.cm.impl.helper.ManagedServiceFactoryTracker.updated(ManagedServiceFactoryTracker.java:159)[6:org.apache.felix.configadmin:1.8.4]
    at org.apache.felix.cm.impl.helper.ManagedServiceFactoryTracker.provideConfiguration(ManagedServiceFactoryTracker.java:93)[6:org.apache.felix.configadmin:1.8.4]
    at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceFactoryUpdate.provide(ConfigurationManager.java:1597)[6:org.apache.felix.configadmin:1.8.4]
    at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceFactoryUpdate.run(ConfigurationManager.java:1540)[6:org.apache.felix.configadmin:1.8.4]
    at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:103)[6:org.apache.felix.configadmin:1.8.4]
    at java.lang.Thread.run(Thread.java:722)[:1.7.0_17]
Caused by: java.lang.IllegalArgumentException: Service object is not an instance of "org.springframework.core.env.EnvironmentCapable".
    at org.apache.felix.framework.Felix.registerService(Felix.java:3386)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)[org.apache.felix.framework-4.2.1.jar:]
    at org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext.publishContextAsOsgiServiceIfNecessary(AbstractOsgiBundleApplicationContext.java:344)[165:org.springframework.osgi.core:1.2.1]
    at org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext.finishRefresh(AbstractOsgiBundleApplicationContext.java:237)[165:org.springframework.osgi.core:1.2.1]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)[161:org.apache.servicemix.bundles.spring-context:3.2.14.RELEASE_1]
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$301(AbstractDelegatedExecutionApplicationContext.java:69)[165:org.springframework.osgi.core:1.2.1]
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$1.run(AbstractDelegatedExecutionApplicationContext.java:186)[165:org.springframework.osgi.core:1.2.1]
    at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)[165:org.springframework.osgi.core:1.2.1]
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.normalRefresh(AbstractDelegatedExecutionApplicationContext.java:182)[165:org.springframework.osgi.core:1.2.1]
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$NoDependenciesWaitRefreshExecutor.refresh(AbstractDelegatedExecutionApplicationContext.java:89)[165:org.springframework.osgi.core:1.2.1]
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.refresh(AbstractDelegatedExecutionApplicationContext.java:175)[165:org.springframework.osgi.core:1.2.1]
    at org.apache.activemq.osgi.ActiveMQServiceFactory.updated(ActiveMQServiceFactory.java:102)[176:org.apache.activemq.activemq-osgi:5.12.1]
    ... 7 more
2015-12-11 10:43:35,095 | INFO  | FelixStartLevel  | BlueprintContainerImpl           | 15 - org.apache.aries.blueprint.core - 1.4.4 | Bundle org.apache.servicemix.activemq.service/6.1.0 is waiting for dependencies [(objectClass=javax.transaction.TransactionManager)]
2015-12-11 10:43:35,101 | INFO  | FelixStartLevel  | BlueprintContainerImpl           | 15 - org.apache.aries.blueprint.core - 1.4.4 | Bundle org.apache.servicemix.activemq.camel/6.1.0 is waiting for dependencies [(&(&(transacted=false)(name=default-cf))(objectClass=javax.jms.ConnectionFactory))]
2015-12-11 10:43:35,104 | INFO  | FelixStartLevel  | CXFActivator                     | 92 - org.apache.cxf.cxf-core - 3.1.4 | Adding the extensions from bundle org.apache.camel.camel-cxf-transport (231) [org.apache.camel.component.cxf.transport.CamelTransportFactory]
...