小编efr*_*eed的帖子

使用AngularFire时,光标会在键入时跳转到字段结尾

我设置了一个编辑一个字段的小样本应用程序.但是当我输入该字段时,内容会一直恢复到一秒钟之前.我正在寻找AngularFire的修复程序,它可以使它正常工作,或者我正在寻找一个我没有正确初始化它的RTFM.此时bindTo()不可用,我根本无法继续使用AngularFire.

这是完整的示例(您可以在http://jsbin.com/wabafu/3上打开它):

<!DOCTYPE html>
<html ng-app="myapp">
  <head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.14/angular.min.js"></script>
    <script src='https://cdn.firebase.com/js/client/1.0.19/firebase.js'></script>
    <script src='https://cdn.firebase.com/libs/angularfire/0.8.0/angularfire.min.js'></script>
    <script>
      var app = angular.module("myapp", ["firebase"]);
      function MyController($scope, $firebase) {
        var ref = new Firebase("https://stackoverflow25331760.firebaseIO.com/"),
            syncObject = $firebase(ref).$asObject();
        syncObject.$bindTo($scope, "data");
      }
    </script>
  </head>
  <body ng-controller="MyController">
    <h3>
      <input type="checkbox" ng-model="EditMode"> Enable Editing
    </h3>
    <div ng-if="EditMode">
      <input type="text" ng-model="data.SyncValue" style="width:100%">
    </div>
    <div ng-if="!EditMode">
      {{data.SyncValue}}
    </div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

它只在一个浏览器中打开时工作顺畅,但是当打开多个时,我不能输入多于一个字或两个字而没有文本内容恢复到几个键击前并且光标移动到字段的末尾.

我想发生的事件是:

  1. 我输入,值在angularjs(GOOD)中更新
  2. Angularfire将新值发送到firebase(GOOD)
  3. Firebase将值发送给其他浏览器(我继续输入时)(好)
  4. 其他浏览器收到新值并更新其html(GOOD)
  5. 其他浏览器将值重新发送回firebase,就像它是新信息一样(真的很糟糕)
  6. Firebase接收到这个回显过时的值并将其推回给我(BAD)
  7. 我的浏览器获得了这个第二旧的值,因为它与我文本字段中的内容不同,我的fiedl的内容被恢复(BAD)

我想这个过程是错的吗?我该怎么做才能停止第5步?

PS测试时,我发现我可以通过快速键入几个字符然后等待2秒重复来解决#7问题.这样,当同步回显并且我的光标不会跳转时,该值不会改变.

PPS为了尝试缩小范围,我创建了一个复选框来控制数据是显示在字段中,还是只显示只读div.即使第二个浏览器仅显示数据,该回显/恢复行为仍然存在于第一个浏览器中.数据正确存储在firebase中的唯一方法是,如果我一次只有一个浏览器使用它.

angularjs firebase angularfire

6
推荐指数
1
解决办法
923
查看次数

平均行长超出可能

这不是InnoDB表大小为什么比预期的大得多的重复项 该问题的答案指出,如果我未指定主键,则将6个字节添加到该行。我确实指定了一个主键,这里有6个以上的字节来解释。


我有一个表,该表预期有数百万条记录,因此我密切注意了每一列的存储大小。 每行应占用15个字节(smallint = 2个字节,date = 3个字节,datetime = 8个字节)

CREATE TABLE archive (
  customer_id smallint(5) unsigned NOT NULL,
  calendar_date date NOT NULL,
  inserted datetime NOT NULL,
  value smallint(5) unsigned NOT NULL,
  PRIMARY KEY (`customer_id`,`calendar_date`,`inserted`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

该表现在有50万条记录,并且存储空间超出了预期。我运行此查询以从系统中获取更多详细信息:

SELECT *
  FROM information_schema.TABLES
 WHERE table_name = 'archive';


information_schema.index_length = 0
information_schema.avg_row_length = 37
information_schema.engine = InnoDB
information_schema.table_type = BASE TABLE
Run Code Online (Sandbox Code Playgroud)

怎么样!?

我原本希望每行15个字节,而这需要37个字节。 谁能给我一个下一个查找说明的想法吗?我已经阅读了很多有关Thais的文章,并且看到了一些有关在行大小上增加6或10个字节的解释,但这并不能解释22个额外的字节。

一种解释是索引也会占用存储空间。该表上没有索引。

一种解释是,information_schema.tables查询返回了不可靠的行数,这会抛出avg_row_length。我已经针对count(*)查询检查了它正在使用的行数,并且只差了一点(1%的1/20),所以这不是全部。

另一个解释是碎片。值得注意的是,该表是通过sql转储重建的,因此没有任何更新,插入和删除操作。

mysql storage

1
推荐指数
1
解决办法
1898
查看次数

标签 统计

angularfire ×1

angularjs ×1

firebase ×1

mysql ×1

storage ×1