Meteor中的非反应性和反应性数据(同一助手)

Meteor中的非反应性和反应性数据(同一助手),meteor,angular-meteor,reactive,Meteor,Angular Meteor,Reactive,我有一个视图显示了用户发布的一些图片和一些数据(让我们来看图片Instagram) 我已经有这些图片作为非反应性数据(否则你会看到很多更新),但这些图片有一个按钮喜欢图片。如果这是非反应性数据,当我点击“喜欢”填充的心脏时,我看不到(我需要刷新) 这是我的订阅功能: this.subscribe('food', () => [{ limit: parseInt(this.getReactively('perPage')), //skip: p

我有一个视图显示了用户发布的一些图片和一些数据(让我们来看图片Instagram)

我已经有这些图片作为非反应性数据(否则你会看到很多更新),但这些图片有一个按钮喜欢图片。如果这是非反应性数据,当我点击“喜欢”填充的心脏时,我看不到(我需要刷新)

这是我的订阅功能:

this.subscribe('food', () => [{
            limit: parseInt(this.getReactively('perPage')),
            //skip: parseInt((this.getReactively('page') - 1) * this.perPage),
            sort: this.getReactively('sort')
        }, this.getReactively('filters'), this.getReactively('searchText'), this.getReactively('user.following')
        ]);
这是我的助手:

food() {

const food = Food.find({}, {reactive: true}, {
                        sort: this.sort
}).fetch().map(food => {
const owner = Meteor.users.findOne(food.owner, {fields: {username: 1, avatarS: 1, following: 1}});
                        food.avatarS = owner && owner.avatarS;
                        food.username = owner && owner.username;

                        if (food.likes.indexOf(Meteor.userId()) == -1) {
                            // user did not like this plate
                            food.liked = false;
                        } else {
                            // user liked this plate
                            food.liked = true;
                        }

                        return food;
                    });
}
是否可能有一个非反应性模型,但其上有一些反应性属性

顺便说一句,我用的是角度1.X

提前谢谢


PS:当我将“反应”更改为“真”时,它作为“非反应”工作是正常的吗?

这只是我的想法

你试过看追踪者吗

但更具体地说是方法
Tracker.nonreactive

对代码的修改:

//console.log(food.likes);
this.subscribe('reactiveFoodData', {ownerId: food.owner, userId: Meteor.userId()}).subscribe(()=>{
    console.log(this.user);
});

// THIS IS THE PUBLISH METHOD LOCATED IN THE SERVER SIDE:
 Meteor.publish('reactiveFoodData', function(params: {ownerId:string, userId:string) {
  const owner = Meteor.users.findOne(params.ownerId);

  if (!owner) {
    throw new Meteor.Error('404', 'Owner does not exist');
  }

  let result = {};
  result.avatarS = owner.avatarS;
  result.username = owner.username;

  const food = Food.find({});
  result.liked = !(food.likes.indexOf(params.userId) == -1);
  return result;
}); 
您没有什么问题: 1.被动标志在默认情况下为true,您不需要设置它。 2.函数find只接受两个参数,而不是3个

应该是:

const food = Food.find({}, {reactive: true, sort: this.sort})
如果您需要某些数据,则数据子集只能是被动的(来自某些集合)。您可以创建一个特定的方法(它只表示“喜欢”)。

更新: 下面是如何编写带有返回参数的方法(请检查两个示例,有Future和无):

更新2:

  • 使用fetch()时,您已失去反应能力。因为您从被动光标移动到了映射值的简单数组。在fetch()之后不要期望反应性。如果您想获取或不想使用游标,可以将find封装在Tracker.autorun(()=>{})中,或者利用发布/订阅 注意:但要小心,如果您设法在find()中获得“空”光标,Tracker.autorun将停止反应。自动运行只有在需要监视的情况下才能工作

  • 这个方法的要点是,如果你想对某件事做一次非反应性的动作。您可以在服务器上定义方法:

    Meteor.methods({
        myMethod: ()=> {
            return "hello";
        }
    });
    
  • 您可以通过以下方式从客户端调用它:

        Meteor.call('myMethod', (error, result) => {
           console.log(result); // "hello"
        });
    
  • 而不是使用纯集合。您可以开始使用发布/订阅。在服务器上发布“likes”,在客户机上只监听这个新的被动视图。例如:

    Meteor.publish('likes', (options: {owner: string, likes: Array<any>}) => {
        let result: any = {}
        const owner = Meteor.users.findOne(options.owner, username: 1, avatarS: 1, following: 1}});
        result.avatarS = options.owner && options.owner.avatarS;
        result.username = options.owner && options.owner.username;
        result.liked = !(options.likes.indexOf(Meteor.userId()) == -1)
        return result;
    });
    
    Meteor.publish('likes',(选项:{owner:string,likes:Array})=>{
    让结果:any={}
    constowner=Meteor.users.findOne(options.owner,用户名:1,头像:1,以下:1});
    result.avatarS=options.owner&&options.owner.avatarS;
    result.username=options.owner&&options.owner.username;
    result.liked=!(options.likes.indexOf(Meteor.userId())=-1)
    返回结果;
    });
    

  • 在客户端:
    Meteor.subscibe('likes',{food.owner,food.likes})。订阅(()=>{})

    很有趣。对我来说,这听起来像是一个全新的概念。我看过这个例子:但我担心的是:“这个函数不会关注您自己定义的函数中的任何反应性数据源更新”。如果我想要那个模型的一些属性呢?很抱歉回复太晚了。。。嗯,好问题是,是否可以专门为反应数据创建订阅?是的,与上述其他用户的方法相同。我以后再试试。干杯你有这种实现的例子吗?我使用一个助手返回一个带有我的数据的游标,但是我不知道我必须在哪里定义这个订阅才能使用这个游标的属性,正如我所说的,这是奇怪的部分。默认情况下为true,但如果我将其添加为true值,则数据不是被动的。但我认为正如另一位用户所说,我应该使用Tracker.nonreactive()。关于三个论点,你是对的。也许我什么都看不到,因为我没有整理好,但很好。关于更新的方法,我应该更改第一个模型中的内容。不确定我是否会跟你说这些。@DanielRodriguez如果你说的是angular meteor(如标签所示,那么这意味着你阅读了他们的教程**),你会用angular2还是angular1来搭配meteor?我遵循angular2教程,它提到了方法函数,可以执行一次并返回值。例如,请参见**这是网站上缺少的内容,但仍然可以在github上查看。@DanielRodriguez检查更新。我认为Tracker有点过头了,你想要的是调用服务器方法并从itI获得响应我完成了他们的教程是的,我使用Angular 1.X和TS(信息更新),但自从我完成后,他们改变并添加了很多东西(事实上,这是我的一个报告:)。嗯,我不确定这个方法。下面的用户对此进行了评论,但此方法必须编辑没有反应的先前模型。你的意思是一种方法,只返回初始模型(例如)model1.like(没有反应性)到model2.like?有趣的更新:)的ng重复中的like和更改。有几点要评论:-你说过我在.fetch()之后会失去反应性。如果删除find上的{reactive:true},则带有.fetch()的事件仍然是reactive。这正常吗当你提到如果光标为空,跟踪器将停止反应时,你的意思是,在向光标添加数据后,我必须“重新激活”它,或者在那一刻无法工作(这是可以理解的),我会在回家后尝试。干杯