如何在控制器中处理多个模型

时间:2014-08-22 14:22:39

标签: ember.js

我开始走的路上有一条返回不同模型的集合(即集合包含App.Person,App.Place,App.Thing等)我已经能够通过提供一个来处理这个问题。基于上下文呈现适当模板的通用视图。这是基本的想法:

    App.SearchView = Ember.View.extend({

        templateName:function(){
            var item = this.get('context');// get the model
            var itemName = item.constructor.toString();// get the type

            if(itemName == "App.Person"){
                return "personTemplate";// this is the name of the template
            }
            if(itemName == "App.Place"){
                return "placeTemplate";
            }
        }.property().cacheable()


    }

对于包含多种模型类型的集合,这是正确的吗?或者我应该使用不同的收藏或技术?

1 个答案:

答案 0 :(得分:1)

当我有多个模型时,这是我采取的方法。

RSVP,Ember的promise库让你返回一个promises哈希值。在完成所有承诺之前,模型钩子不会返回。如果散列中的某个属性没有返回一个promise(即只是立即返回一个值),一切仍然正常。

model: function(){
    Ember.RSVP.hash({
        person: getPersonLogic,
        place: getPlaceLogic,
        thing: getThingLogic
    });
}

然后在你的模板中:

{{render 'personTemplate' model.person}}
{{render 'placeTemplate' model.place}}
{{render 'thingTemplate' model.thing}}

如果您只想一次显示一个:

//route
renderTemplate: function(controller,model){
    this.render();
    //render person by default
    this.render("personTemplate", {outlet: "named", into: "routeThatContainsOutlet", model: model.person})
},
actions: {
    showPerson: function(){
        this.render("personTemplate", {outlet: "named", into: "routeThatContainsOutlet", model: model.person})
    },
    showPlace: function(){
        this.render("placeTemplate", {outlet: "named", into: "routeThatContainsOutlet", model: model.place})
    },
    showThing: function(){
        this.render("thingTemplate", {outlet: "named", into: "routeThatContainsOutlet", model: model.thing})
    }
}

在你的模板中:

<button {{action showPerson}}>Show Person</button>
<button {{action showPlace}}>Show Place</button>
<button {{action showThing}}>Show Thing</button>
{{outlet named}}

目前还不清楚您的实际使用情况,但这应该让您朝着正确的方向努力