刚刚通过Meteor教程并希望介绍添加,更新和删除函数的方法,这样我就不会直接从客户端编写,并且允许使用Collection.allow执行此操作...使用方法,我总是遇到
RangeError: Maximum call stack size exceeded
at Object.toString (native)
at isArguments (http://localhost:3000/packages/es5-shim.js?03b82f907286b5353e3a371eb320635a634fc88b:988:12)
at Function.keys (http://localhost:3000/packages/es5-shim.js?03b82f907286b5353e3a371eb320635a634fc88b:1051:13)
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:155:20)
at Object.EJSON.clone (http://localhost:3000/packages/ejson.js?5e95dd4b5971d96cb2d3287c54b14d9002f83ab7:528:5)
at http://localhost:3000/packages/ejson.js?5e95dd4b5971d96cb2d3287c54b14d9002f83ab7:529:22
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:157:22)
at Object.EJSON.clone (http://localhost:3000/packages/ejson.js?5e95dd4b5971d96cb2d3287c54b14d9002f83ab7:528:5)
at http://localhost:3000/packages/ejson.js?5e95dd4b5971d96cb2d3287c54b14d9002f83ab7:529:22
at Function._.each._.forEach (http://localhost:3000/packages/underscore.js?46eaedbdeb6e71c82af1b16f51c7da4127d6f285:157:22)
所以这是我的代码:
方法:
Meteor.methods({
addParty: function (party) {
// Make sure the user is logged in before inserting a task
if (!Meteor.userId()) {
throw new Meteor.Error('not-authenticated');
}
party.owner = Meteor.userId();
party.username = Meteor.user().username;
party.createdAt = new Date();
Parties.insert(party);
},
removeParty: function (party) {
// Make sure only the party owner can delete a party
if (party.owner !== Meteor.userId()) {
throw new Meteor.Error('not-authorized');
}
Parties.remove(party._id);
},
updateParty: function (party) {
// Make sure only the party owner can delete a party
if (party.owner !== Meteor.userId()) {
throw new Meteor.Error('not-authorized');
}
Parties.update(party._id, party);
}
});
UI: 在这里,您将看到并更改聚会的详细信息:
<input ng-model="party.name">
<input ng-model="party.description">
<label>Is public</label>
<input type="checkbox" ng-model="party.public">
<button ng-click="save(party)">Save</button>
<button ng-click="reset()">Reset form</button>
<button ui-sref="parties">Cancel</button>
控制器:
$scope.party = $meteor.object(Parties, $stateParams.partyId, false);
$scope.save = function(updatedParty) {
$meteor.call('updateParty', updatedParty);
};
但是在处理集合时这是有效的:
$scope.addParty = function(newParty){
$meteor.call('addParty', newParty);
}
$scope.remove = function(party){
$meteor.call('removeParty', party);
}
当我这样做时,就像它在教程中,从客户端调用它,它可以工作,但我希望将它作为一种方法并更新本文档中的所有字段。我还试图在Meteor.methods.updateParty中删除所有内容,或者使用$ set,仍然会收到错误。我尝试的似乎没什么用。有人看到问题所在吗?
谢谢
更新于2015年10月29日。 17时51
好的,当我改变派对的接收时间:
$scope.party = $meteor.object(Parties, $stateParams.partyId, false).subscribe('parties');
为:
$scope.party = Parties.findOne($stateParams.partyId);
然后方法调用工作。但是现在不起作用的是当我更新页面时,当我第一次来的时候,派对不再被取回。有什么提示吗?
现在的问题是,这是正确的方法。
我应该使用Parties.findOne获取它...还是可以使用$ meteor.object获取它并定义我可以从客户端写入允许:
Parties.allow({
update: function (userId, party, fields, modifier) {
return userId && party.owner === userId;
}
});
答案 0 :(得分:1)
所以,我有一个有效的解决方案。
我在模型中创建了一个方法(客户端和服务器之间的共享代码),以便从DB中检索一方:
getOneParty: function(partyId) {
var party = Parties.findOne(partyId);
return party;
},
然后在客户端我有这个:
$meteor.subscribe('parties');
$scope.partyId = $stateParams.partyId; // getting this data from params
$party = $meteor.call('getOneParty', $scope.getReactively('partyId')).then(
function(data){
$scope.party = data;
console.log('successfully got Party: ', data);
},
function(err){
console.log('failed', err);
}
);
然后我可以在没有任何问题的情况下调用此函数:
$scope.save = function(updatedParty) {
$meteor.call('updateParty', updatedParty);
};
所以,仍然不确定下面的其他方式是否更好,但至少我现在有两个版本工作:)不确定下面的一个,因为客户端然后直接写入DB,这是不是那么安全?
客户代码:
$meteor.subscribe('parties');
$scope.party = $meteor.object(Parties, $stateParams.partyId, false);
更新方法:
$scope.save = function(updatedParty) {
$scope.party.save().then(function(numberOfDocs){
console.log('save success doc affected ', numberOfDocs);
}, function(error){
console.log('save error', error);
});
};
但为此,有必要授权客户这样做。您可以在模型中执行此操作:
Parties.allow({
update: function (userId, party, fields, modifier) {
return userId && party.owner === userId;
}
});
答案 1 :(得分:0)
试试这个:
$scope.$meteorSubscribe('parties', $stateParams.partyId).then(function() {
$scope.party= s.$meteorObject(Parties, {
_id: $stateParams.partyId
}, false);
}, function(data) {
alert("Error loading ");
console.log(data);
})
我遇到了同样的问题,不知道为什么。出于某种原因,这为我解决了这个问题。