首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Meteor 1.3中使用“inProgress team/ Reactive本机流星”的反应性用法

在Meteor 1.3中使用“inProgress team/ Reactive本机流星”的反应性用法
EN

Stack Overflow用户
提问于 2016-04-20 09:44:01
回答 1查看 204关注 0票数 2

我有一个项目的反应-本机(0.23)与Meteor 1.3作为后端,并希望显示一个联系项目列表。当用户单击联系人项时,我希望在项目前面显示一个复选标记。

对于与Meteor的连接,我使用可怕的库进展中-团队/反应-原生流星

代码语言:javascript
复制
import Meteor, { connectMeteor, MeteorListView, MeteorComplexListView } from 'react-native-meteor';

class ContactsPicker extends React.Component {

constructor(props) {
    super(props);
    this.state = {
        subscriptionIsReady: false
    };
}

componentWillMount() {
    const handle = db.subscribe("contacts");
    this.setState({
        subscriptionIsReady: handle.ready()
    });
}

render() {
    const {subscriptionIsReady} = this.state;
    return (
        <View style={gs.standardView}>
            {!subscriptionIsReady && <Text>Not ready</Text>}
            <MeteorComplexListView
                elements={()=>{return Meteor.collection('contacts').find()}}
                renderRow={this.renderItem.bind(this)}
            />
        </View>
    );
}

第一个问题是,一旦subscriptionIsReady返回true,它就不会触发重呈现。如何等待订阅做好准备,然后更新模板?

我的第二个问题是,单击列表项会更新状态,并且应该显示一个复选标记,但是如果MeteorListView已经更改,那么dataSource只能重新呈现。是否有任何方法强制重新呈现而不更改/更新dataSource?

编辑1(解决方案1):

谢谢你@user1078150提供了一个有效的解决方案。在这里,完整的解决方案是:

代码语言:javascript
复制
'use strict';
import Meteor, { connectMeteor, MeteorListView, MeteorComplexListView } from 'react-native-meteor';


class ContactsPicker extends React.Component {

getMeteorData() {

    const handle = Meteor.subscribe("contacts");
    return {
        subscriptionIsReady: handle.ready()
    };
}

constructor(props) {

    super(props);

    this.state = {
        subscriptionIsReady: false
    };
}

componentWillMount() {
    // NO SUBSCRIPTION HERE
}

renderItem(contact) {
    return (
        <View key={contact._id}>
            <TouchableHighlight onPress={() => this.toggleSelection(contact._id)}>
                <View>
                    {this.state.selectedContacts.indexOf(contact._id) > -1 && <Icon />}
                    <Text>{contact.displayName}</Text>
                </View>
            </TouchableHighlight>
        </View>
    )
}

render() {
    const {subscriptionIsReady} = this.data;
    return (
        <View>
            {!subscriptionIsReady && <Text>Not ready</Text>}
            <MeteorComplexListView
                elements={()=>{return Meteor.collection('contacts').find()}}
                renderRow={this.renderItem.bind(this)}
            />
        </View>
    );
}
}

connectMeteor(ContactsPicker);
export default ContactsPicker;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-20 09:53:36

你必须这样做:

代码语言:javascript
复制
getMeteorData() {
    const handle = Meteor.subscribe("contacts");
    return {
        ready: handle.ready()
    };
}
render() {
    const { ready } = this.data;


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

https://stackoverflow.com/questions/36739862

复制
相关文章

相似问题

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