Model view controller Ember.js:如何访问CollectionView中的特定项目?

Model view controller Ember.js:如何访问CollectionView中的特定项目?,model-view-controller,ember.js,Model View Controller,Ember.js,首先,我想说我真的很喜欢ember.js。我尝试过击倒和角球,但发现他们有点突兀,一切都必须按他们的方式进行。我觉得余烬让我有了更多的自由来组织你认为合适的事情。说到这里,我有几个问题 1。我想做一些类似以下的事情,但显然不起作用: 相反,我必须创建一个绑定: 如何在视图中创建url路径?我可以很容易地在模型上创建一个名为url的计算属性,但这感觉很糟糕,而且不是很MVC。我必须为元素创建一个新视图还是注册一个感觉有点麻烦的助手 以下是完整的代码: App = Ember.Applicati

首先,我想说我真的很喜欢ember.js。我尝试过击倒和角球,但发现他们有点突兀,一切都必须按他们的方式进行。我觉得余烬让我有了更多的自由来组织你认为合适的事情。说到这里,我有几个问题

1。我想做一些类似以下的事情,但显然不起作用:

相反,我必须创建一个绑定:

如何在视图中创建url路径?我可以很容易地在模型上创建一个名为url的计算属性,但这感觉很糟糕,而且不是很MVC。我必须为元素创建一个新视图还是注册一个感觉有点麻烦的助手

以下是完整的代码:

App = Ember.Application.create();

var sampleData = [ Ember.Object.create({ id: '123456789', name: 'John' }), Ember.Object.create({ id: '987654321', name: 'Anne' }) ]

App.itemController = Ember.ArrayController.create({
    content: sampleData,
    removeItem: function(item) {
        this.content.removeObject(item);
    }
});

App.ItemListView = Ember.View.extend({
    itemDetailView: Ember.CollectionView.extend({
        contentBinding: 'App.itemController',
        itemViewClass: Ember.View.extend({
            tagName: 'li',
            url: '' // HOW TO GET '/item/123456789'
            deleteButton: Ember.Button.extend({
                click: function(event) {
                    var item = this.get('content');
                    App.itemController.removeItem(item);
                }
            })
        })
    })
});

<script type="text/x-handlebars">
    {{#view App.ItemListView}}
        <ul id="item-list">
            {{#collection itemDetailView}}
                <div class="item">
                    <a {{ bindAttr href="url" }}><h3>{{ content.name }}</h3></a>
                    {{#view deleteButton class="btn" contentBinding="content"}}Delete{{/view}}
                </div>
            {{/collection}}
        </ul>
    {{/view}}
</script>
App=Ember.Application.create();
var sampleData=[Ember.Object.create({id:'123456789',name:'John'}),Ember.Object.create({id:'987654321',name:'Anne'})]
App.itemController=Ember.ArrayController.create({
内容:样本数据,
removeItem:功能(项){
this.content.removeObject(项);
}
});
App.ItemListView=Ember.View.extend({
itemDetailView:Ember.CollectionView.extend({
contentBinding:'App.itemController',
itemViewClass:Ember.View.extend({
标记名:“li”,
url:“”//如何获取“/item/123456789”
deleteButton:Ember.Button.extend({
单击:功能(事件){
var item=this.get('content');
App.itemController.removietem(项目);
}
})
})
})
});
{{{#查看App.ItemListView}
    {{{#collection itemDetailView} {{{查看删除按钮class=“btn”contentBinding=“content”}删除{{/view} {{/collection}
{{/view}
2。我觉得视图“拥有”了控制器,而不是相反。视图不应该不知道它连接到哪个控制器,这样您就可以重用视图了吗?我在想视图中的这些线条:

contentBinding:'App.itemController',

App.itemController.removietem(项目)

你是如何构造这个的

3。我意识到一切都是一项正在进行中的工作,而且随着名称的改变,一切都是新的,但文档却不清楚。这些示例使用旧的名称空间SC,与Sproutcore 2.0指南相比,emberjs.com上缺少很多东西,例如集合、ArrayController。我在这里的某个地方读到,藏品将被淘汰。这是真的吗?我应该用#每个来代替吗

感谢您的帮助和一个很棒的框架

1.)如果要使用
,则需要计算属性。它可以在您的模型上或视图上。另一种方法是使用Ember.Button:
{{{{#查看Ember.Button标记名=“a”target=“…”action=“…”}}}}{{/view}}

2.)通常,您希望在模板中而不是在视图中声明控制器绑定。例如:
{{{}查看App.ItemListView contentBinding=“App.itemController”}


3.
#集合
帮助程序可能会被弃用,因此您可能应该改用
#each

谢谢!我不知道如何在视图上创建computed属性,但下面是一个示例,如果有人对
url:function(){var id=this.getPath('content.id')返回'/apps/'+id;}.property('content.id')
不推荐使用的集合上的任何引用?或者我可以去哪里了解像这样的余烬新闻呢?Peter Wagnet刚刚在IRC聊天中告诉我将我的{{{each}}块转换为一个集合。Peter在开发Ember.js方面相当活跃,所以我想知道团队是否已经改变了对不推荐CollectionView的想法。