保存模型时Backbone.js问题

时间:2011-06-18 23:23:33

标签: javascript backbone.js

我遇到了backbone.js和model.save()方法的问题。我已经在下面提供了一个完整的例子,尽管没有三个库需要。

我有一个标记模型,一个标记集合模型和一个模型来表示我的UI中的一些选定项目,称为搜索条件。

在我操作搜索条件的标记集合后尝试保存模型时,我收到了网址错误。这个例子说明了这个问题。

看来,在本例中保存的最后一次调用中,backbone无法解析标记集合模型中定义的url。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Test</title>
    <script src="Scripts/Libraries/jquery-1.6.1.js" type="text/javascript"></script>
    <script src="Scripts/Libraries/underscore.js" type="text/javascript"></script>
    <script src="Scripts/Libraries/backbone.js" type="text/javascript"></script>

    <script language="javascript" type="text/javascript">

        $(function () {

            // Simple model for a tag. Tags have an id and a title.
            var TagModel = Backbone.Model.extend({});

            // Collection for tags.
            var TagCollection = Backbone.Collection.extend({
                model: TagModel,
                url: "tags"
            });

            // Sample model to hold a set of "selected" search criteria.
            // Includes search text and a collection of "selected" tags.
            var SearchCriteriaModel = Backbone.Model.extend({
                defaults: {
                    "searchText": "",
                    "tags": new TagCollection()
                }
            });

            // Create master tags collection.
            window.tags = new TagCollection();
            window.tags.refresh([
                { id: 1, title: "Tag A" },
                { id: 2, title: "Tag B" },
                { id: 3, title: "Tag C" }
            ]);

            // Create search criteria.
            window.searchCriteria = new SearchCriteriaModel();

            // Should be 3 tags.
            console.log("Should be 3 tags in master tags list.");
            console.log("Count = " + window.tags.size());

            // Should be 0 tags in criteria collection.
            console.log("Should be 0 selected tags.");
            console.log("Count = " + window.searchCriteria.get("tags").size());

            // Update tag title for tag 1.
            var tag = window.tags.get(1);
            tag.set({ "title": "Tag AA" });

            // Save tag.
            console.log("Try to save tag. Should attempt PUT to /tags/1. WORKS.")
            tag.save();

            // Add tag to search criteria.
            window.searchCriteria.get("tags").add(tag);

            // Should be 1 tag in criteria collection now.
            // I am not moving the tag, but rather wanting to simply add a reference to the tag to the
            // criteria collection.
            console.log("Should be 1 selected tags.");
            console.log("Count = " + window.searchCriteria.get("tags").size());

            // Should STILL be 3 tags in the master list.
            console.log("Should be 3 tags in master tags list.");
            console.log("Count = " + window.tags.size());

            // Update tag title for tag 1 again.
            var tag = window.tags.get(1);
            tag.set({ "title": "Tag AAA" });

            // Save tag.
            console.log("Try to save tag. Should attempt PUT to /tags/1. WORKS.")
            tag.save();

            // Remove tag from criteria. Simulates someone "deselecting" a tag from the search.
            window.searchCriteria.get("tags").remove(tag);

            // Should be 0 tags selected.
            console.log("Should be 0 selected tags.");
            console.log("Count = " + window.searchCriteria.get("tags").size());

            // Save tag. FAILS.
            console.log("Try to save tag. Should attempt PUT to /tags/1, but does not. Instead throws error 'A url property or function must be specified'.");
            tag.save();

        });

    </script>

</head>
<body>
    <h1>Test</h1>
    <p>Backbone test page.</p>
</body>
</html>

有什么想法?谢谢!

已更新

我更新了代码以帮助说明我没有在集合之间移动标记,而是将标记的引用添加到第二个集合。然后,当我从第二个集合(而不是第一个)中删除标签时,Backbone无法解析第一个集合,然后无法获取保存的URL。

我很困惑为什么从一个集合中删除标记会对单独集合中对该标记的引用产生影响。

我来自C#背景。也许对象和集合在这里的工作方式不同。

2 个答案:

答案 0 :(得分:1)

您已经运行了两个标记集合(一个在窗口上,一个在SearchCriteriaModel中定义),您似乎正在两个集合之间移动标记

执行以下代码行时:

window.searchCriteria.get("tags").remove(tag);

标记与集合之间的链接将丢失.. URL是从集合中确定的。

请注意,如果您删除上面的行,那么您的代码会在从window.tags集合中获取URL时保存。

Ps ..好问题,问得好,格式化的代码示例证明了这个问题。

答案 1 :(得分:0)

不知道这是否解决了您的问题,但您应首先将您的网址更改为“/ tags”而不仅仅是“标记”