当前位置: 首页 > 面试题库 >

我可以像其他任何库一样将JointJS作为AngularJS模块注入吗?

酆翔宇
2023-03-14
问题内容

我有一个带有angular的应用程序,我需要使用这个库http://www.jointjs.com/,所以我下载了joint.min.js和joint.min.css并将它们的路由放置在index.html中,但是我不知道要在app.js中放入什么来注入它,而我一直在从角度获取注入错误。这可能不是这样做的方法吗?我搜索了很多,但是没有找到任何方法。我将不胜感激,在此先感谢您!


问题答案:

如果要在角度应用程序中渲染Jointjs图,那么这很容易做到。在我的情况下,我将Jointjs代码封装在一个角度指令中,并传递给Jointjs图形对象。(简化的)指令如下所示:

(function () {
    'use strict';

    var app = angular.module('app');

    app.directive('jointDiagram', [function () {

        var directive = {
            link: link,
            restrict: 'E',
            scope: {
                height: '=',
                width: '=',
                gridSize: '=',
                graph: '=',
            }
        };

        return directive;

        function link(scope, element, attrs) {

            var diagram = newDiagram(scope.height, scope.width, scope.gridSize, scope.graph, element[0];

            //add event handlers to interact with the diagram
            diagram.on('cell:pointerclick', function (cellView, evt, x, y) {

                //your logic here e.g. select the element

            });

            diagram.on('blank:pointerclick', function (evt, x, y) {

                // your logic here e.g. unselect the element by clicking on a blank part of the diagram
            });

            diagram.on('link:options', function (evt, cellView, x, y) {

                // your logic here: e.g. select a link by its options tool
            });
        }

        function newDiagram(height, width, gridSize, graph, targetElement) {

            var paper = new joint.dia.Paper({
                el: targetElement,
                width: width,
                height: height,
                gridSize: gridSize,
                model: graph,
            });

            return paper;
        }

    }]);

})();

如果需要通过图与模型进行交互,请使用Jointjs事件处理程序,并将它们连接到指令中作用域上的函数(如上面的代码所示)。

要在您的视图中使用它:

<joint-diagram graph="vm.graph" width="800" height="600" grid-size="1" />

就我而言,在第一种情况下,graph.fromJSON我使用控制器中的Jointjs
函数创建了图形(严格来说,这是在控制器中调用的数据服务组件中),然后将其添加到范围中。

function getDiagram() {
    return datacontext.getDiagram($routeParams.diagramId).then(function (data) {
        vm.graph.fromJSON(JSON.parse(diagramJson));
    });
}

这种方法可以很好地用于在图中添加和删除元素和链接以及在周围拖动东西。您的控制器代码仅适用于图对象,并且对图呈现的所有更新均由Jointjs处理。

function addCircle(x, y, label) {

    var cell = new joint.shapes.basic.Circle({
        position: { x: x, y: y },
        size: { width: 100, height: 100 },
        attrs: { text: { text: label } }
    });
    graph.addCell(cell);
    return cell;
};

Jointjs是一个很棒的库,但它基于Backbone.js进行数据绑定。我发现的唯一问题是,在要使用angular编辑图表元素属性(例如,包含的文本)的情况下,它在与angular配合时效果不佳。例如,我有一个属性窗格(角度视图),用于编辑选定的图元素属性。

我为此提出了一个怪异的解决方法,我对此感到to愧,无法穿上SO;
o)我仍在学习角度/关节/骨干,因此希望在我完成项目时能有更好的方法。如果可以,我会在这里发布。也许比我更专业的人可能已经做得更好了-
我很高兴看到这里发布了更好的方法

总的来说,该指令是一种方法,但感觉像是Angular和Jointjs之间的表面集成。本质上,该指令在角度应用程序内部创建了“
jointjs岛”。我想找到一种更“ Angular Native”的方法,但是可能需要重写Jointjs以使用angular而不是骨干…

Ps如果您的应用程序中已经有jquery,则可以从Jointjs下载页面中获得一个不包含jquery的joint版本:

http://www.jointjs.com/download



 类似资料:
  • 问题内容: 当使用angular 1.2代替1.07时,以下代码不再有效,为什么? 问题出在喷射器配置部分(app.config)中: 如果我没记错的话,这个问题是从1.1.6开始的。 问题答案: 该问题是由于缺少ngRoute模块而引起的。从1.1.6版开始,它是一个单独的部分:

  • 问题内容: 在我的Java EE 6网络应用程序(在最新的GlassFish 3.1上运行)中,我正在使用JSF2-ManagedBeans并将其注入到其他ManagedBeans中。现在我想知道是否也可以使用将a 注入a 中。一些代码: ManagedBean看起来像这样: 这样工作吗?如果没有,我还必须通过什么其他方式将ManagedBean注入WebServlet(不使用CDI,目前还不行,

  • 问题内容: 我想在整个应用程序中共享一些变量,例如基本路径。这些变量需要在模块配置期间访问。我的意见是,我可以为此使用常量或提供程序。 我有几个模块,每个模块都有自己的路由配置。例如,在这些路由配置中,我想访问一些设置。 这适用于应用程序模块配置,但不适用于其他模块配置(对于其他模块上的控制器而言),我总是收到“未知提供者:来自myApp.orders的信息”。 我想我只是错过了一些细节,您有想法

  • 问题内容: 我有一个需要一些模块。有没有办法可以注入模块本身?我意识到这有点麻烦。 例: 我想在这种情况下,解决方案是将方法转换为完整的类。这显然是一个简化的示例;我正在处理的代码有很多这样的方法,因此将它们分成单独的类并引入配置它们的模块会增加相当多的混乱- 我认为Guice就是要减少样板混乱? 也许这反映了我对Guice的相对呆板,但是我遇到了很多尝试着做上述事情的案例。我肯定错过了什么… 问

  • 问题内容: 我正在使用Google AppEngine创建一个由多个Google模块组成的项目。如何设置我的项目(使用Maven),以便可以跨模块共享源代码,例如Objectify对象模型定义,共享的实用程序代码和单元测试代码? 但是,我担心Google App Engine模块可能有一些特殊之处,使其与Maven模块有所不同。然后,上面的方法可能行不通。 作为我为什么担心的一个示例,请注意Goo