- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目标是构建一个用户界面来选择 T 恤的品牌、尺码和颜色。并非所有颜色都适用于每个尺码,也并非所有尺码/颜色都适用于每个品牌。
所以基本的 UI 是品牌、尺寸和颜色的三个选择元素。
在阅读了一堆教程之后,我开始为品牌、尺寸和颜色创建模型,为每个品牌、尺寸、颜色和 View 创建集合,并编写代码来连接它们……有点迷路了头脑。
第二次尝试在这里,我创建了一个“Confg”模型和一个“Config” View 。模型作为当前品牌、尺寸和颜色的属性,以及当前可选择的品牌、型号和颜色的属性。
作为经验丰富的 backbone.js 专家,您会这样处理这个问题吗?
这是模型。基本上,我“手动”处理在 setMake 方法中获取正确的尺寸/颜色,并在 setSize 方法中更正颜色,然后对模型进行必要的更改。
var design_id = 2; // set server-side
var ConfigModel = Backbone.Model.extend({
initialize: function(){
this.baseUrl = "/designs/" + design_id + "/configure/";
},
setMake: function(make_id){
var me = this;
var make = _.find(this.get("makes"), function(el){
return el.id == make_id });
// aggregate changes to the model:
var changes = {
"make": make
};
// get current make/size/color:
var cur_make_id = make.id;
var cur_size_id = this.get("size").id;
var cur_color_id = this.get("color").id;
// get sizes for the current make:
$.getJSON(me.baseUrl + "makes/" + cur_make_id + "/sizes/",
function(data){
changes.sizes = data;
if(!_.find(data, function(el){
return el.id == cur_size_id })){
// the currently selected size is not available,
// so use the first size
changes.size = data[0];
cur_size_id = changes.size.id;
}
// and get the colors for the current make and size:
$.getJSON(me.baseUrl + "makes/" + cur_make_id
+ "/sizes/" + cur_size_id + "/colors/",
function(data){
changes.colors = data;
if(!_.find(data,
function(el){
return el.id == cur_color_id })){
// the currently selected color
// is not available,
//so use the first one in the list
changes.color = data[0];
}
me.set(changes);
});
});
},
setSize: function(size_id){
// retrieve colors for the new size
var me = this;
var size = _.find(this.get("sizes"),
function(el){ return el.id == size_id });
var changes = {
"size": size
};
var cur_make_id = this.get("make").id;
var cur_size_id = size.id;
var cur_color_id = this.get("color").id;
$.getJSON(me.baseUrl + "makes/" + cur_make_id +
"/sizes/" + cur_size_id + "/colors/",
function(data){
changes.colors = data;
if(!_.find(data,
function(el){
return el.id == cur_color_id })){
changes.color = data[0];
}
me.set(changes);
});
},
setColor: function(color_id){
var color = _.find(this.get("colors"),
function(el){
return el.id == color_id });
this.set({"color": color});
}
});
这是模型实例。初始默认值是在服务器端设置的:
var Config = new ConfigModel({
design_id: 2,
make: {"id": 1, "name": "Men's Organic Cotton Tee"},
size: {"id": 4, "name": "L"},
color: {"id": 2, "name": "Black"},
makes: [{"id": 2, "name": "Women's Organic Cotton Tee"},
{"id": 1, "name": "Men's Organic Cotton Tee"}],
sizes: [{"id": 2, "name": "S"},
{"id": 3, "name": "M"},
{"id": 4, "name": "L"}],
colors: [{"id": 2, "name": "Black"},
{"id": 3, "name": "red"}]
});
这是 View 。我认为这非常简单。绑定(bind)到选择元素上的更改事件并在模型上调用 setMake 或 setSize,然后监听来自模型的更改事件:
var ConfigView = Backbone.View.extend({
el: $("#config"),
optionsTemplate: _.template($("#options-template").html()),
events:{
"change #make select": "onChangeMake",
"change #size select": "onChangeSize",
"change #color select": "onChangeColor"
},
initialize: function(){
Config.bind("change:makes", this.updateMakes, this);
Config.bind("change:sizes", this.updateSizes, this);
Config.bind("change:colors", this.updateColors, this);
},
render: function(){
//console.log("ConfigureView.render");
this.updateSelect("make");
this.updateSelect("size");
this.updateSelect("color");
},
updateMakes: function(){
this.updateSelect("make");
},
updateSizes: function(){
this.updateSelect("size");
},
updateColors: function(){
this.updateSelect("color");
},
updateSelect: function(which){
// updates the select specified by "which"
this.$("#" + which + " select").html(this.optionsTemplate({
chosen:Config.get(which),
options:Config.get(which + "s")
}));
},
onChangeMake: function(){
Config.setMake(this.$("#make select").val());
},
onChangeSize: function(){
Config.setSize(this.$("#size select").val());
},
onChangeColor: function(){
Config.setColor(this.$("#color select").val());
}
});
var app = new ConfigView();
app.render();
最佳答案
有人告诉我,您的 $.getJSON 函数应该改为 Backbone Collections。
http://documentcloud.github.com/backbone/#Collection
使用集合而不是您正在做的事情将使您的应用程序更易于阅读和管理。同样使用 $.getJSON 而不是 backbone 的集合可以避免 backbone 的单一模型。
这实际上是我不久前在 StackOverflow 上发布的一个问题,它可能与我所说的有关。看看 Julien 是怎么说的。
关于javascript - 我的第一个主干模型/ View 。我在正确的轨道上吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687236/
我想使用 Orbited 进行聊天。我还找到了 Orbited2。有什么不同? Orbited 死了没有?我想用solid solution,不用担心会被关闭或不支持。我还没有找到任何关于 Orbit
我最近开始学习SFML,我有一个问题,如何使第二个物体在轨道上运动,请帮助。 #include using namespace sf; int main() { RenderWindow wi
我正在尝试使用 Tweepy 获取所有带有关键字的推文,但它没有返回某些关键字的任何内容。例如,如果使用 Obama 作为关键字,我会收到很多推文,如果我使用 Arduino,我不会收到任何返回信息,
在我看来,我有一个复选框和一个标签。我正在使用 SLIM,所以代码是 = check_box_tag 'All Products' = label_tag 'All Products' 生成的等效 H
正如倾斜所暗示的那样,我试图弄清楚如何嵌入 soundcloud 文件,以及如何轻松更改嵌入的声音.. 我有一个网站,目前,让用户写一个故事,然后附加一个图像或视频。对于视频,我使用 vimeo 和
我创建了一个在应用程序的实际背景上绘制的 slider 轨道,并且还绘制了 UISlider 拇指图像。我知道如何设置 slider 的缩略图。但如何隐藏 UISlider 轨道呢? 最佳答案 如果你
从 HTTP 链接下载的 Windows Media DRM 轨道是否可以合法渐进播放? 我已经设法在没有 DRM 的情况下做到了这一点,但这里有人告诉我,使用 DRM 是不可能的。这是真的? 如果是
我有一个简单的 vtt 轨道文件编辑器,其中构建的 vtt 文件内容保存在 var vtt 中. 目前我通过保存vtt的内容来添加轨道。到文件,然后将文件读取为 我想省略保存到文件的步骤,直接将变量
我有一个简单的应用程序,用户可以在其中的文本字段中输入内容以获得各种结果。我想要一个功能,如果用户输入某些内容然后关闭浏览器选项卡,下次他们来时,我可以向他们展示他们之前/最近的搜索。即使他们关闭整个
我试图在不同的线程中同时运行 4 个 MP3 轨道。我正在使用 JLayer1.0 MP3 library播放 MP3。鉴于我无法控制线程何时启动,我使用 CountDownLatch 至少让它们同时
我可以在我的 Android 应用程序中播放来自 SoundCloud 的轨道吗?我正在尝试这段代码,但它不起作用: String res = "https://api.soundcloud.com/
我正在使用 Apple Music API 的 recent played endpoint返回最近播放的媒体 Assets 列表。 然后我使用其中之一并在 MPMusicPlayerControll
我正在使用 Foundation Orbit slider 。它工作正常,只是我需要将一些 css(移动标题)应用于页面上的特定 slider 。 如果我使用以下选择器,它会进行更改,唯一的问题是它是
我最难搞清楚如何在 Foundation 的 Orbit slider 中制作两个文本元素和一个按钮。对于这样的初学者问题,我深表歉意,但我是 Foundation 的新手,有些语法让我感到困惑。 这
我需要来自 SoundCloud 的“最流行”或“ HitTest 门的轨道”,但我找不到任何方法来做到这一点。我可以从 http://api.soundcloud.com/tracks?filter
我刚刚从 Rails 3.2 切换到 Rails 4。我正在努力确保我尽可能了解安全问题,并且我现在担心 session 。看起来 Rails 4 已经不再支持除基于 cookie 的 session
我正在开发一个应用程序,用户可以在其中流式传输或下载视频。我使用 ExoPlayer 2.9.6 实现了相同的功能。目前,在播放下载的内容时,当我尝试切换质量时,它仅显示下载的轨道。我知道它的默认行为
有谁知道制作这样的标题的最佳方法 http://i.imgur.com/NOSF0.png ?我试过使用 Firebug 并实现了这个 http://i.imgur.com/cMB3Y.png但是当我
我正在使用 Zurb 轨道 slider :http://www.zurb.com/playground/jquery_image_slider_plugin 我使用以下设置进行幻灯片放映: $(wi
所以我们在这里:http://greeceinsiders.com/VLASIOS/offcanvas/studio.html 我按照说明在页面中放置轨道 slider ,但这个似乎不起作用。我从其他
我是一名优秀的程序员,十分优秀!