我是 Meteor 和 angular2-meteor 包的新手,我正在尝试按照此处找到的精心制作的“社交”应用程序教程学习如何使用它们:Socially turorial。
在尝试我在那里看到的关于发布/订阅功能的内容时,我发现了一个我不知道如何解决的问题。为了清楚起见,我用这个结构做了一个非常简单的项目:
/typings/test.d.ts
interface Test {
_id?: string;
num: number;
}
/collections/tests.ts
export var Tests = new Mongo.Collection<Test>('tests');
/server/main.ts
import './tests';
/server/test.ts - 只是发布所有内容
import {Tests} from 'collections/tests';
Meteor.publish('tests', function() {
return Tests.find();
});
/client/app.ts - 订阅排序结果
import {Component, View} from 'angular2/core';
import {bootstrap} from 'angular2-meteor';
import {MeteorComponent} from 'angular2-meteor';
import {Tests} from 'collections/tests';
@Component({
selector: 'app'
})
@View({
templateUrl: 'client/app.html'
})
class Socially extends MeteorComponent {
tests: Mongo.Cursor<Test>;
constructor(){
super();
this.subscribe('tests', () => {
this.tests = Tests.find({}, {sort: {num: -1}});
}, true);
}
}
bootstrap(Socially);
/client/app.html - 一个简单的 ngFor,显示结果
<div>
<ul>
<li *ngFor="#test of tests">
<p>{{test._id}}</p>
<p>{{test.num}}</p>
</li>
</ul>
</div>
如果我使用 Mongo 控制台从数据库中插入或删除条目,一切正常。如果我在不更改其顺序的情况下更新现有条目,也会发生同样的事情。但是,如果我尝试更新已经存在的条目之一,在其“num”字段中放置更高的数字,使它们切换位置,则应用程序将停止正常工作,并且浏览器控制台会显示:
例外:类型错误:l_test0 在 Socially@3:15 的 [{{test._id}} 中未定义]
例如,如果我有:
编号:1 - 编号:6
编号:2 - 编号:5
编号:3 - 编号:4
然后我尝试用 "num" 4 将 "num" 改为 7 来更新条目,新结果应该是:
- 编号:3 - 编号:7
- 编号:1 - 编号:6
- 编号:2 - 编号:5
这给了我上述错误。
这可能很愚蠢,但由于我是一个真正的流星新手,我似乎无法理解出了什么问题,如果你能帮我一把,我会很高兴。
先感谢您。
编辑: 在我的原始项目中,我使用表单直接从页面添加/删除条目。在这个测试项目中,我删除了所有不必要的东西以使其尽可能简单并使用 mongo 控制台:
db.tests.insert({_id: 1, num: 6})
db.tests.insert({_id: 2, num: 5})
db.tests.insert({_id: 3, num: 4})
db.tests.update({_id: 3}, {$set: {num: 7}})
如果我这样做:
db.tests.find()
表明:
{ "_id" : 1, "num" : 6 }
{ "_id" : 2, "num" : 5 }
{ "_id" : 3, "num" : 7 }