に簡単なチャットを書きたいmeteor.js
ので、にデータを保存したくありませんdatabase
。しかし、私はdatabase
。なしでアプリケーションを作成する方法を見つけられませんでした。
これが私が想像できるコードの例です。サーバーコード:
export let ws = [{_id:'1', text:'test1'}, {_id:'2', text:'test2'}];
Meteor.publish('ws', function wsPub() { return ws; });
let ctr = 3;
Meteor.methods({
'addMsg'(text) { ws.push({_id:ctr+1, text:text}); }
});
およびクライアントコード:
import {ws} from '../api/model.js';
class Rtc extends Component {
constructor(props) {
super(props);
}
addMsg(e){
e.preventDefault();
Meteor.call('addMsg', this.refs.input.value);
}
render() {
return (
<div>
{this.props.ws.map((item, i)=>{
return(<span key={i._id}>{item.text}</span>);
})}
<input type="text" ref="input" />
<input type="submit" value="submit" onClick={this.addMsg.bind(this)}/>
</div>
);
}
}
export default createContainer( () => {
Meteor.subscribe('ws');
return { ws: ws };
}, Rtc);
しかし、私が書いたものがそうではないのか分かりませんcreateContainer
か?
UPD:サーバーコードを更新しましたが、それでもWebSocketが機能しません:
Meteor.publish('ws', function wsPub() {
let self = this;
ws.forEach( (msg)=> {
self.added( "msg", msg._id, msg.text );
});
self.ready();
// return ws;
});
あなたは、パブリッシュ「インスタンスを公開する」(特定のサブスクリプションには本当に特定のクライアント)への参照を取得の上に送られるかを制御し、その使用したい場合はadd
/ change
/remove
コマンドを:
let messages = [];
let clients = [];
Meteor.publish('ws', function() {
clients.push(this);
_.each(messages, (message) => {this.added('msg', message._id, message);});
this.ready();
});
Meteor.methods({
addMsg(text) {
let newMessage = {_id: Meteor.uuid(), text: text};
messages.push(newMessage);
_.each(clients, (client) => {client.added('msg', newMessage._id, newMessage);});
}
});
更新で記述したコードに関して:string
関数added
がドキュメントを期待する場所(an object
)を送信しています。また、上記のこの例とは異なり、ws
(メッセージ配列)がいつ変更されたかをクライアントに通知しません。
また、これらの名前をより冗長で明確になるように名前を変更することをお勧めします:)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加