首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mouseover事件jCanvas上显示来自jCanvas的指定数据

在mouseover事件jCanvas上显示来自jCanvas的指定数据
EN

Stack Overflow用户
提问于 2017-05-05 14:44:52
回答 1查看 56关注 0票数 1

我遇到了另一个与KnockoutJS和jCanvas有关的问题。我的模型和ViewModel:

代码语言:javascript
复制
eventsModel = function () {
            var self = this;
            self.events = ko.observableArray([]);
        }     
eventItemViewModel = function(o) {
        var self = this;
        self.BeginInMinutes = ko.observable(o.BeginInMinutes);
        self.EventDuration = ko.observable(o.EventDuration);
        self.Type = ko.observable(o.Type);
        self.ReferenceNumber = ko.observable(o.ReferenceNumber);
        self.FullDescription = ko.computed(function () {
            var eventType = self.Type() == '0' ? 'Driving' : 'Resting';
            var hour = Math.floor(self.BeginInMinutes() / 60);
            var minutes = Math.floor(self.BeginInMinutes() % 60) < 10 ? '0' + Math.floor(self.BeginInMinutes() % 60) : Math.floor(self.BeginInMinutes() % 60);
            return hour + ':' + minutes + " " + eventType + " " + self.EventDuration();    
        }, this);
    };

    var events = new eventsModel();
    ko.applyBindings(events);

我觉得现在应该够了。基本上,我想在画布上显示这个FullDescription,但问题是它包含在数组中。在画布中,我有一些绘图,所有的属性都与画布中的矩形相连。我想做这样的事情:在jCanvas中的矩形鼠标事件中,我想显示fullDescription,例如在画布上方的纯文本中。

我使用敲除数据来显示表中的一些信息-绑定、前景等,但现在我想从整个集合中显示这一特定信息。我试过了,如果绑定,但它不起作用。

我的画布

代码语言:javascript
复制
<canvas id="myCanvas" width="1000" height="300"></canvas>

也许我之前的问题有一些有价值的信息:Knockout observablearray of observables with arrayMap function

我确信这应该是从数组中只获取指定字段的一些简单方法。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-07 08:13:24

这实际上是非常简单的与Knockout。您只需将画布放入一个Knockout前端,然后所有常见的Javascript事件都可以作为Knockout绑定(如mouseover)。一个简单的例子是:

HTML:

代码语言:javascript
复制
<div data-bind="foreach: { data: items, afterRender: itemRendered}">
    <span data-bind="text: description"></span><br />
    <canvas data-bind="event: {mouseover: $parent.doSomething}, attr: { id: itemId }" style="background-color: blue"></canvas><br />
</div>

Javascript:

代码语言:javascript
复制
var MyViewModel = function () {
    var self = this;

    self.items = ko.observableArray(
        [
            { itemId: 1, description: "Item #1" },
            { itemId: 2, description: "Item #2" },
            { itemId: 3, description: "Item #3" }
        ]
    );

    self.doSomething = function (selectedItem) {
        alert("You hovered over " + selectedItem.description);
    };

    self.itemRendered = function (o, renderedItem) {
        console.log("Initialize your jCanvas here for canvas id: MyCanvas" 
        + renderedItem.itemId);
    };
};

如您所见,迭代observableArray中的数据项的行为实际上将该项作为数据上下文附加到每个画布上,以便当您在呈现的画布上进行某些事件时,它可以在处理程序函数中被接收,并且您可以访问该特定项的所有属性和函数。在本例中,我将传递的项称为"selectedItem“。

现在,只要将jCanvas连接到画布标记,就可以使用foreach绑定的afterRender回调,它将在呈现的项中传递一个DOM元素数组(我们现在可以忽略它),以及数据项本身。我们可以使用"attr“绑定获取该数据项的id,将其附加到画布上,然后以编程方式在我们的itemRendered处理程序函数中初始化每个单独的itemRendered。

这给了你世界上所有的灵活性来定义每个画布将如何呈现(形状、颜色等)。所有这些都可以由每个项目中的数据驱动。

下面是一个JSFiddle来尝试它:

https://jsfiddle.net/snydercoder/wkcqr76L/

另外,参考Knockout文档中的"foreach“和"attr”绑定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43807867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档