更新函数返回错误

时间:2015-05-03 18:26:51

标签: meteor

此代码返回“错误:$ scope.todoItems.update不是函数” (在markDone函数中)

正如我在控制台中看到的那样,$ scope.todoItems具有save(),remove()但不是update()函数的功能,但我可以看到here我写得正确。

我做的事情是错的吗?更多信息会有所帮助吗?

TodoItems = new Mongo.Collection('todoItems');

if(Meteor.isClient){
    angular.module('todo_am', ['angular-meteor']);

    angular.module('todo_am').controller('OutputListCtrl', ['$scope', '$meteor',
        function($scope, $meteor){
            $scope.todoItems = $meteor.collection(TodoItems);

            $scope.remove = function(todoItem){
                $scope.todoItems.remove(todoItem);
            };

            $scope.saveCustom = function(todoItem){
                todoItem.isRead = false;
                $scope.todoItems.save(todoItem);
            };

            $scope.markDone = function(todoItem){
                console.log('>>> 4', todoItem);
                console.log('>>> 5', $scope.todoItems);
                $scope.todoItems.update(todoItem._id, { $set: { isRead: true }});   // <<<<<<<<< This line returns error
            };

            $scope.markUndone = function(todoItem){
                todoItem.isRead = true;
                $scope.todoItems.update(todoItem);
            };
        }]);
}

------------------------------更新---------------- ----------------

这是有效的:

if(Meteor.isClient){
    angular.module('todo_am', ['angular-meteor']);

    angular.module('todo_am').controller('OutputListCtrl', ['$scope', '$meteor',
        function($scope, $meteor){
            $scope.todoItems = $meteor.collection(TodoItems);

            $scope.remove = function(todoItem){
                $scope.todoItems.remove(todoItem);
            };

            $scope.saveCustom = function(todoItem){
                todoItem.isRead = false;
                $scope.todoItems.save(todoItem);
            };

            $scope.markDone = function(todoItem){
                TodoItems.update({ _id: todoItem._id }, { $set: { isRead: true }});
            };

            $scope.markUndone = function(todoItem){
                TodoItems.update({ _id: todoItem._id }, { $set: { isRead: false }});
            };
        }]);
}

------------------------------ UPDATE2 ---------------- ----------------

这是完整的代码。我不知道它是否是一个正确的解决方案,但它确实有效。

DB中有更新存在记录的例子吗?

$ meteor --version

Meteor 1.1.0.2

正如我在.meteor / versions文件中看到的那样:

角:angular@1.3.15_1

urigo:angular@0.8.6

的index.html

<body ng-app="todo_am">
<div ng-controller="OutputListCtrl">
    <div ng-include="'output-list.ng.html'"></div>
    <div ng-include="'insert-new-form.ng.html'"></div>
</div>
</body>

index.ng.html

<p>Nothing</p>

插入新-form.ng.html

<div>
    <input type="text" ng-model="newTodoItem.text" />
    <button ng-click="saveCustom(newTodoItem); newTodoItem='';"  >Add New</button>
</div>

输出list.ng.html

<div>
    <ul>
        <li ng-repeat="todoItem in todoItems">
            <p>
                {{ todoItem.text }}
                <span ng-switch on="todoItem.isRead">
                    <span ng-switch-when="true">
                        <button ng-click="markUndone(todoItem)">Mark Undone</button>
                    </span>
                    <span ng-switch-default>
                        <button ng-click="markDone(todoItem)">Mark Done</button>
                    </span>
                </span>
                <button ng-click="remove(todoItem)">X</button>
            </p>
        </li>
    </ul>
</div>

app.js

TodoItems = new Mongo.Collection('todoItems');

if(Meteor.isClient){
    angular.module('todo_am', ['angular-meteor']);

    angular.module('todo_am').controller('OutputListCtrl', ['$scope', '$meteor',
        function($scope, $meteor){
            $scope.todoItems = $meteor.collection(TodoItems);

            $scope.remove = function(todoItem){
                $scope.todoItems.remove(todoItem);
            };

            $scope.saveCustom = function(todoItem){
                todoItem.isRead = false;
                $scope.todoItems.save(todoItem);
            };

            $scope.markDone = function(todoItem){
                TodoItems.update({ _id: todoItem._id }, { $set: { isRead: true }});
            };

            $scope.markUndone = function(todoItem){
                TodoItems.update({ _id: todoItem._id }, { $set: { isRead: false }});
            };
        }]);
}

if(Meteor.isServer){
    Meteor.startup(function(){
        /**
         * If DB is empty, add some todoItems just for DEV purposes
         */
        if (TodoItems.find().count() === 0) {

            var todoItems = [
                {
                    'text': 'First todo first todo first todo first todo first todo first todo first todo first todo first todo',
                    'isRead': true,
                    'userPosted': 'Vasia'
                },
                {
                    'text': 'Second todo item',
                    'isRead': false,
                    'userPosted': 'Fedia'
                },
                {
                    'text': 'Third todo item',
                    'isRead': true,
                    'userPosted': 'Vasia'
                }
            ];

            for (var i = 0; i < todoItems.length; i++)
                TodoItems.insert({text: todoItems[i].text, isRead: todoItems[i].isRead});

        }
    });
}

1 个答案:

答案 0 :(得分:1)

这看起来并不像$ scope.todoItems是Meteor集合。如果你浏览一下你链接的文档(http://docs.meteor.com/#/full/mongo_collection) - 那么就没有提到Meteor的Mongo Collections有&#34; save&#34;方法

看起来你正在使用&#34; Angular Meteor Collection&#34; - http://angularjs.meteor.com/api/AngularMeteorCollection

在这种情况下,简单地调用&#34; .save&#34;应该这样做。也许是这样的:

$scope.markDone = function(todoItem){
    todoItem.isRead = true;
    $scope.todoItems.save(todoItem);
};