2

我有一个视图显示用户发布的一些带有一些数据的图片(让我们图像 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:当我将反应性更改为真时,这是否正常工作?

4

2 回答 2

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 和没有): 如何在 Meteor.methods 中调用函数并返回值

更新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(()=>{});

于 2017-02-06T22:51:01.357 回答
1

这只是我的想法。

你试过看Tracker吗?https://docs.meteor.com/api/tracker.html

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

于 2017-02-06T22:49:47.507 回答