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

时间:2017-02-06 22:17:24

标签: meteor angular-meteor reactive

我有一个视图显示用户发布的一些图片和一些数据(让我们的图像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:当我将反应变为真时,这是不正常的吗?

2 个答案:

答案 0 :(得分: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.默认情况下,反应标志为真,您无需进行设置。 2.函数find只接受两个参数,而不是3。

应该是:

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

如果您需要某些数据子集,则只能进行反应(来自某些集合)。您可以创建一个特定的方法(仅限udpates"喜欢")。 https://guide.meteor.com/methods.html

<强>更新 以下是使用return参数编写方法的方法(查看两个示例,使用Future和不使用): How to invoke a function in Meteor.methods and return the value

<强> UPDATE2:

  1. 使用fetch()时失去了反应性。因为您从反应光标移动到仅映射值的简单数组。在fetch()之后不要指望反应。如果您想要获取或不想使用游标,您可以将查找包装在Tracker.autorun(()=&gt; {})内或利用发布/订阅。
  2. 注意:但要小心,如果你以某种方式设法得到&#34;空&#34;光标在find()中,你的Tracker.autorun将停止反应。只有在需要监视的情况下,自动运行才有效。

    1. 方法的要点是,如果你想有一次非反应动作的东西。您在服务器上定义方法:

      Meteor.methods({
          myMethod: ()=> {
              return "hello";
          }
      });
      
    2. 您可以通过以下方式从客户端拨打电话:

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

        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;
        });
        
      2. 在客户端:Meteor.subscibe('likes', {food.owner, food.likes}).subscribe(()=>{});

答案 1 :(得分:1)

这只是我的头脑。

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

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