Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干无法读取属性';财产';主干视图中未定义错误的定义_Javascript_Backbone.js_Backbone Views - Fatal编程技术网

Javascript 主干无法读取属性';财产';主干视图中未定义错误的定义

Javascript 主干无法读取属性';财产';主干视图中未定义错误的定义,javascript,backbone.js,backbone-views,Javascript,Backbone.js,Backbone Views,我刚决定学习脊梁骨。我在看视频教程。在那里一切都很好,但在我的末尾我得到了这个错误“uncaughttypeerror:无法读取未定义的属性'name' 这是我的密码: var MenuItemDetails = Backbone.View.extend({ render: function() { var markup = this.options.name + this.options.category + this.options.imagepath

我刚决定学习脊梁骨。我在看视频教程。在那里一切都很好,但在我的末尾我得到了这个错误“uncaughttypeerror:无法读取未定义的属性'name'

这是我的密码:

var MenuItemDetails = Backbone.View.extend({ render: function() { var markup = this.options.name + this.options.category + this.options.imagepath; // I also had some html markup in the string above, of course, but I've striped it because stackoverflow didn't show it in the preview of my post. this.$el.html(markup); return this; } }); var AppRouter = Backbone.Router.extend({ routes: { "" : "list", "menu-items/new" : "itemForm", "menu-items/:item" : "itemDetails" }, list: function() { $('#app').html('List screen'); }, itemDetails: function(item) { var view = new MenuItemDetails({ name: item, category: 'Some category', imagepath: 'no-image.jpg' }); $('#app').html(view.render().el); }, itemForm: function() { $('#app').html('New item form'); } }); var app = new AppRouter(); $(function() { Backbone.history.start(); }); var MenuItemDetails=Backbone.View.extend({ render:function(){ var markup=this.options.name+this.options.category+this.options.imagepath; //当然,我在上面的字符串中也有一些html标记,但我已经将其条带化,因为stackoverflow没有在我的文章预览中显示它。 这个.$el.html(标记); 归还这个; } }); var AppRouter=Backbone.Router.extend({ 路线:{ “:”列表“, “菜单项/新建”:“项目表单”, “菜单项/:项”:“项详细信息” }, 列表:函数(){ $('#app').html('列表屏幕'); }, itemDetails:功能(项目){ var view=new MenuItemDetails({name:item,category:'Some category',imagepath:'no image.jpg'}); $('#app').html(view.render().el); }, itemForm:function(){ $('#app').html('新项目表单'); } }); var app=新批准者(); $(函数(){ Backbone.history.start(); }); “itemDetails”函数给出了“UncaughtTypeError:无法读取未定义的属性“name”错误。当然,如果我不在视图中使用'name'属性,我会得到“uncaughttypeerror:无法读取未定义的'category'属性”。在我下面的视频教程中,一切正常(它使用backbonejs的0.9.1版)。我使用最新版本(1.1.0)

有人知道我为什么会犯这个错误吗?
没有任何拼写错误,所有内容都按正确的顺序排列(与视频教程中的内容完全相同)。为什么主干向我抛出此错误?

主干视图用于自动将构造函数选项复制到
此。选项

更改日志
1.1.0-2013年10月10日

  • 主干视图不再自动附加作为
    this.options传递给构造函数的选项,但是如果愿意,您可以自己执行
因此,如果您依赖于在视图中设置的
此.options
,则您必须自己执行此操作:

var MenuItemDetails = Backbone.View.extend({
    initialize: function(options) {
        this.options = options;
    },
    //...
});
或者更好的方法是,解压缩选项,以便了解视图的界面:

initialize: function(options) {
    this.options = _(options).pick('name', 'category', 'imagepath');
}

这样,您至少有一个您希望在
选项中看到的列表

我喜欢选项的白名单。另一个值得一读的答案是:)@nikoshr:是的,我从来都不喜欢自动
这个。选项
之类的东西,太多不可追踪的东西。“我应该如何在六个月内调试这个远程操作的东西?”我喜欢的魔法。