【问题标题】:Non-reactive and reactive data in Meteor (same helper)Meteor 中的非反应性和反应性数据(相同的助手)
【发布时间】:2017-06-24 00:21:42
【问题描述】:

我有一个视图显示用户发布的一些带有一些数据的图片(让我们图像 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;
                    });
}

是否可以有一个非反应性模型但具有一些反应性属性?

我正在使用 Angular 1.X 和 TS btw

提前致谢!

PS:当我将 reactive 更改为 true 时,这是否正常工作?

【问题讨论】:

    标签: meteor angular-meteor reactive


    【解决方案1】:

    这只是我的想法。

    您是否尝试过查看 Trackerhttps://docs.meteor.com/api/tracker.html

    但更具体的方法Tracker.nonreactive https://docs.meteor.com/api/tracker.html#Tracker-nonreactive

    【讨论】:

    • 有趣。对我来说,这听起来像是一个全新的概念。我看过这个例子:stackoverflow.com/questions/29197247/… 但我很担心:“这个函数不会关注你自己定义的函数中的任何反应数据源更新”。如果我想要该模型响应式的某些属性怎么办?
    • 抱歉回复晚了...嗯,好问题也许可以专门为响应式数据创建订阅?
    • 是的,与上述其他用户的方法相同。我稍后会尝试。干杯!
    • 你有这个实现的例子吗?我使用助手返回带有我的数据的游标,但我不知道必须在哪里定义此订阅才能使用此游标中的属性
    【解决方案2】:

    修改您的代码:

    //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、reactive标志默认为true,不需要设置。 2. 函数 find 只接受两个参数,而不是 3。

    应该是:

    const food = Food.find({}, {reactive: true, sort: this.sort})
    

    如果您需要一些数据子集,则仅是反应性的(来自某个集合)。您可以创建一个特定的方法(仅更新“喜欢”)。 https://guide.meteor.com/methods.html

    更新: 以下是您如何编写带有返回参数的方法(检查两个示例,有 Future 和没有 Future): How to invoke a function in Meteor.methods and return the value

    更新 2:

    1. 您在使用 fetch() 时失去了反应性。因为您从反应式光标移动到仅在其上映射值的简单数组。不要期望 fetch() 之后的反应。如果您想获取或不想使用游标,您可以将 find 包装在 Tracker.autorun(()=>{}) 中或使用发布/订阅。

    注意:但要小心,如果你设法在 find() 中获得“空”光标,你的 Tracker.autorun 将停止反应。自动运行仅在需要注意的情况下才有效。

    1. 方法的要点是,如果您想对某事进行一次性非反应性操作。您在服务器上定义方法:

      Meteor.methods({
          myMethod: ()=> {
              return "hello";
          }
      });
      

    你可以从客户端调用它:

        Meteor.call('myMethod', (error, result) => {
           console.log(result); // "hello"
        });
    
    1. 而不是使用纯集合。您可以开始使用发布/订阅。在服务器上发布“喜欢”,在客户端上,您只需收听这个新的反应式视图。例如,

      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.subscibe('likes', {food.owner, food.likes}).subscribe(()=&gt;{});

    【讨论】:

    • 这就是我所说的奇怪的部分。默认情况下它是真的,但如果我用一个真值添加它,数据不是反应性的。但我认为正如其他用户所说,我应该使用 Tracker.nonreactive()。关于你是对的3个论点。也许我什么都看不到,因为我没有对它进行排序,但是很好。关于更新喜欢的方法,我应该更改第一个模型中的内容。不确定我是否关注你。
    • @DanielRodriguez 如果你在谈论 angular-meteor(正如标签所暗示的,那么这意味着你阅读了他们的教程**)你使用 angular2 还是 angular1 和流星?我遵循了 angular2 教程,它提到了方法函数,可以执行一次并返回值。例如,请参阅 github.com/Urigo/meteor-angular2.0-socially/blob/master/both/… ** 一些网站上缺少的部分,但仍可以在 github 上查看。
    • @DanielRodriguez 检查更新。我认为 Tracker 有点矫枉过正,你想要的是调用服务器方法并从中获得响应
    • 我完成了他们的教程,是的,我正在使用带有 TS 的 Angular 1.X(信息已更新),但自从我完成后,他们更改并添加了很多东西(事实上,这是我的报告之一: github.com/Urigo/angular-meteor/issues/1369)。嗯,不知道方法。下面的用户发表了相同的评论,但此方法必须编辑以前没有反应的模型。你的意思是一个方法只是返回like并将初始模型(例如)model1.like(没有反应)的ng-repeat更改为model2.like?
    • 有趣的更新 :) 需要评论的几点: - 你说我会在 .fetch() 之后失去反应性。如果我在我的发现中删除 {reactive: true} ,带有 .fetch() 的事件仍然是反应性的。这正常吗? - 当您提到如果光标为空,Tracker 将停止反应性反应,您的意思是我必须在向光标添加数据后“重新激活”它,或者在那一刻不起作用(这是可以理解的)我会试试这个后来我回家的时候。干杯!
    猜你喜欢
    • 2014-06-20
    • 2015-02-23
    • 2014-10-18
    • 2016-05-15
    • 2021-10-20
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多