流星JS:如何将文档插入到集合中,但只能在客户端?

尚波里

我是Meteor的新手,正在构建一个简单的应用程序以学习框架。我正在构建的应用程序可让您将文字放在小猫的图像上。

所需的行为是这样的:

用户单击小猫上的任意位置,然后出现一个contenteditable元素,允许用户输入文本。单击元素外部将保存该元素,并且该元素将保留在原位。

我遇到的问题是:

如果我使用该应用程序打开了两个浏览器窗口,并且在一个窗口中单击了一只小猫,则两个窗口中都会出现一个空白字段。理想情况下,空字段将仅出现在我单击的窗口上。保存单词后,在两个窗口中都应可见in。

我的问题:

有没有一种方法可以insert将文档仅upsert添加到客户端的集合中,然后在以后使用该文档将其添加到服务器端集合中?

这是我尝试过的:

我创建了仅在客户端用于插入文档的存根方法。问题在于,当我单击图像时,空白字段会出现一秒钟,然后再次消失。

这是代码:

image-tags.js

if (Meteor.isClient) {
  var isEditing;

  Template.image.image_source = function () {
    return "http://placekitten.com/g/800/600";
  };

  Template.tag.rendered = function(){
    var tag = this.find('.tag');
    if (isEditing && !tag.innerText) {
      tag.focus();
    }
  }

  Template.image.events({
    'click img' : function (e) {
      if (isEditing) {
        isEditing = false;
      } else {
        isEditing = true;
        var mouseX = e.offsetX;
        var mouseY = e.offsetY;

        // Tags.insert({x:mouseX, y:mouseY});

        // Insert tag on the client-side only.
        // Upsert later when the field is not empty.
        Meteor.call('insertTag', {x:mouseX, y:mouseY});
      }
    },

    'click .tag' : function (e) {
      isEditing = true;
    },

    'blur .tag' : function (e) {
      var currentTagId = this._id;
      var text = e.target.innerText;

      if(text) {
        Tags.upsert(currentTagId, {$set: {name: text}});
      } else {
        Tags.remove(currentTagId);
      }
    }
  });

  Template.image.helpers({
    tags: function() {
      return Tags.find();
    }
  });

  // Define methods for the collections
  Meteor.methods({
    insertTag: function(attr) {
      Tags.insert({x:attr.x, y:attr.y});
    }
  });
}

// Collections
Tags = new Meteor.Collection('tags');

image-tags.html

<head>
  <title>Image Tagger</title>
</head>

<body>
  {{> image}}
</body>

<template name="image">
  <figure>
    <img src="{{image_source}}" />
    <figcaption class="tags">
        {{#each tags}}
          {{> tag}}
        {{/each}}
      </figcaption>
  </figure>
</template>


<template name="tag">
  <div class="tag" contenteditable style="left: {{x}}px; top: {{y}}px;">
    {{name}}
  </div>
</template>
sbking

您应该将临时标记(可能还有您的isEditingvar)存储在中Session

Session.set("isEditing", true);
Session.set("newTag", {x:mouseX, y:mouseY});

您也可以null在初始化时通过传递而不是集合名称来创建本地集合但是,Session应该为您正在做的事情工作。查看排行榜中的示例。

编辑:

<figcaption class="tags">
  {{#each tags}}
    {{> tag}}
  {{/each}}
  {{#with newTag}}
    {{> tag}}
  {{/with}}
</figcaption>

Template.image.newTag = function() {
  return Session.get("newTag");
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将数据推回流星中的客户端?

有关如何将扩展库部署到Notes客户端的文档?

如何将iText PDF文档返回给客户端

流星1.3:如何创建仅包含用户db集合中某些字段的客户端集合?

在Play中,如何将js文件从ScalaJS客户端复制到服务器?

流星JS-客户端集合似乎为空

如何将jwt从swift客户端传递到node.js服务器

如何对仅客户端(本地)流星集合进行排序

无法从流星中的客户端访问集合

在 Eclipse RAP 中,如何将当前 UI 状态推送/强制到客户端?

如何将数据发布到测试客户端发布请求中?

如何将客户端值从浏览器端传递到node.js控制器

如何将消息发送到Node.js中的特定客户端

如何使用流星将数据插入服务器端main.js上的集合中?

在流星中如何将第一个部分数据返回给客户端后如何保持服务器端计算

如何将客户端Javascript数组和通过Node.js API POST到MongoDB数据库中?

我如何将Java对象从服务器端传递到客户端

如何将值从 golang 发送到 vue js(服务器到客户端)?

角流星:在插入新文档时通知客户端

如何处理流星中的客户端对象?

发送连接升级后,如何将客户端http连接升级到golang中的websockets

如何将Hashmap插入到MongoDB文档中?

在Node.js / Express.js中,如何将JSON对象从服务器传输到客户端?

如何将节点 js 服务器中的 html 格式数据附加到客户端的 html 文件中?

如何将套接字数据发送到节点js中的特定客户端(基于deviceId)?

Node.js-如何将文件夹中已经可用的Excel文件导出到客户端/ UI?

如何将JSON数组写入node.js中的文件并再次请求客户端

如何将多个文件发送到节点 js 中的客户端(作为源)页面

如何将参数从客户端传递到http适配器