你如何正确显示基于模型的JavaScript数组属性骨干木偶集合看法?(How do you pro

2019-07-30 20:03发布

* 更新 :见最后的答案代码下面最后一个代码块。 *

目前,我有集合视图中显示收集的问题。 集合是现有模型的属性,像这样(伪代码)

ApplicationVersion { Id: 1, VersionName: "", ApplicationCategories[] }

所以基本上ApplicationVersion有一个名为ApplicationCategories属性,它是一个JavaScript阵列。 目前,当我渲染ApplicationCategories没有呈现关联的集合视图。 如果我在Chrome的JavaScript调试器调试看来该类别还没有被填充,但(所以我想ApplicationVersion尚未获取)。 这里是我的代码,因为它目前为

ApplicationCategory模型,收集和查看

ApplicationModule.ApplicationCategory = Backbone.Model.extend({
    urlRoot:"/applicationcategories"
});

ApplicationModule.ApplicationCategories = Recruit.Collection.extend({
    url:"/applicationcategories",
    model:ApplicationModule.ApplicationCategory,

    initialize: function(){
        /*
         * By default backbone does not bind the collection change event to the comparator
         * for performance reasons.  I am choosing to not preoptimize though and do the
         * binding.  This may need to change later if performance becomes an issue.
         * See https://github.com/documentcloud/backbone/issues/689
         *
         * Note also this is only nescessary for the default sort.  By using the
         * SortableCollectionMixin in other sorting methods, we do the binding
         * there as well.
         */
        this.on("change", this.sort);
    },

    comparator: function(applicationCategory) {
        return applicationCategory.get("order");
    },

    byName: function() {
        return this.sortedBy(function(applicationCategory) {
            return applicationCategory.get("name");
        });
    }
});

_.extend(ApplicationModule.ApplicationCategories.prototype, SortableCollectionMixin);

ApplicationModule.ApplicationCategoryView = Recruit.ItemView.extend({
    template:"application/applicationcategory-view-template"
});

ApplicationModule.ApplicationCategoriesView = Recruit.CollectionView.extend({
    itemView:ApplicationModule.ApplicationCategoryView
});

ApplicationCategory模板

<section id="<%=name%>">
   <%=order%>
</section>

ApplicationVersion模型,收集和查看

ApplicationModule.ApplicationVersion = Backbone.Model.extend({
    urlRoot:"/applicationversions"
});

ApplicationModule.ApplicationVersions = Recruit.Collection.extend({
    url:"/applicationversions",
    model:ApplicationModule.ApplicationVersion
});

ApplicationModule.ApplicationVersionLayout = Recruit.Layout.extend({
    template:"application/applicationversion-view-template",

    regions: {
        applicationVersionHeader: "#applicationVersionHeader",
        applicationVersionCategories: "#applicationVersionCategories",
        applicationVersionFooter: "#applicationVersionFooter"
    }
});

ApplicationModule.ApplicationVersionController = {
    showApplicationVersion: function (applicationVersionId) {
        ApplicationModule.applicationVersion = new ApplicationModule.ApplicationVersion({id : applicationVersionId});

        var applicationVersionLayout = new Recruit.ApplicationModule.ApplicationVersionLayout({
            model:ApplicationModule.applicationVersion
        });

        ApplicationModule.applicationVersion.fetch({success: function(){
            var applicationVersionCategories = new Recruit.ApplicationModule.ApplicationCategoriesView({
                collection: ApplicationModule.applicationVersion.application_categories
            });
            applicationVersionLayout.applicationVersionCategories.show(applicationVersionCategories);
        }});

        // Fake server responds to the request
        ApplicationModule.server.respond();

        Recruit.layout.main.show(applicationVersionLayout);
    }
};

这里是我的ApplicationVersion模板

<section id="applicationVersionOuterSection">
<header id="applicationVersionHeader">
    Your Application Header <%= id %>
</header>
<section id="applicationVersionCategories">
</section>
<footer id="applicationVersionFooter">
     Your footer
</footer>

有一点要注意我目前使用兴农嘲笑我的服务器响应,但它与信息响应如我所料翻翻JavaScript调试器(就像我说的它显示ApplicationVersion我不认为这是导致问题ID正确)。 我可以提供这样的代码,以及是否有帮助

这是当前显示的应用程序版本ID(模板ID),所以我知道这是正确的获取数据的正常特性,它只是不使我ApplicationCategories JavaScript数组属性。

所以,最后我结合的取指ApplicationVersion成功,则设置为ApplicationCategories的看法。 由于这是不工作像我期望我想知道是否有更好的方法来创建这个集合的看法?

谢谢你的帮助

更新:德里克·贝利带领我工作的代码示例了。

ApplicationModule.ApplicationVersionController = {
    showApplicationVersion: function (applicationVersionId) {
        ApplicationModule.applicationVersion = new ApplicationModule.ApplicationVersion({id : applicationVersionId});

        var applicationVersionLayout = new Recruit.ApplicationModule.ApplicationVersionLayout({
            model:ApplicationModule.applicationVersion
        });

        ApplicationModule.applicationVersion.fetch();

        // Fake server responds to the request
        ApplicationModule.server.respond();

        Recruit.layout.main.show(applicationVersionLayout);

        var applicationVersionCategories = new Recruit.ApplicationModule.ApplicationCategoriesView({
            collection: new Backbone.Collection(ApplicationModule.applicationVersion.get('application_categories'))
        });
        applicationVersionLayout.applicationVersionCategories.show(applicationVersionCategories);
    }
};

Answer 1:

木偶的的CollectionView需要一个有效的Backbone.Collection,不是一个简单的数组。 你需要将它传递给视图时,从您的阵列创建Backbone.Collection:


new MyView({
  collection: new Backbone.Collection(MyModel.Something.ArrayOfThings)
});


文章来源: How do you properly display a Backbone marionette collection view based on a model javascript array property?