我试图从骨干模型中完全删除属性.该模型被发送到一个不太灵活的API,如果我发送我应该发送的属性,它将会中断,所以我需要删除一个属性,使其不再存在.
我试过model.unset,从这个问题,但当我打印出对象时,我正在尝试删除的属性仍然列出,只是值为null.
我需要完全消失该属性.
我的基本结构是:
model.unset("AttrName", "silent");
Run Code Online (Sandbox Code Playgroud) 我绑定了我的骨干模型的更改事件.
this.model.on( "change", this.render, this );
Run Code Online (Sandbox Code Playgroud)
有时我想获取模型的最新版本并强制渲染视图.所以我这样做
this.model.fetch();
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果新数据与先前存储在模型中的数据不同,model.fetch()仅触发change事件.
当获取完成时,我怎样才能始终触发this.render回调,无论它是否触发更改事件?
在此先感谢您的帮助
这是我在BackBone.js上工作的最初时期.我实际上卡在路由器部分,因为我在控制台中收到错误"错误:必须指定url属性或函数".这是我的情景; 我有一个动态形成REST URL的点击功能,并相应地从服务器获取数据.
这是点击功能代码
function onUserClick(obj){
var userID=$(obj).attr('id');
window.location.href="#"+userID+"/";
var userRouter = new UserRouter;
}
Run Code Online (Sandbox Code Playgroud)
我在路由器中有以下代码
var userModel;
var UserRouter = Backbone.Router.extend({
routes:{
":userid/":"getUsers"
},
getUsers:function(userid){
var url="http://myserver.com/users/"+userid;
userModel = new UserModel({urlRoot:url});
var userView = new UserView({el:$(#"container")});
}
});
var UserModel = Backbobe.Model.extend({});
var UserView = Backbone.View.extend({
model:userModel,
initialize:function(){
_.templateSettings = {
interpolate: /\{\{\=(.+?)\}\}/g,
evaluate: /\{\{(.+?)\}\}/g
};
this.model.fetch();
this.model.bind("change",this.render,this);
},
render:function(){
var data=this.model.toJSON();
var userTemplate=_.template($("#userTemplate").text());
var htmlData=userTemplate({
"userData":data
});
$(this.el).html(htmlData);
}
});
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?我知道我在这里做错了什么,并就此寻求专家意见.非常感谢这种情况的一个woking样本.
如何在集合提取中阻止模型的解析功能?
$(function() {
var Task = Backbone.Model.extend({
url : function() {
return this.urlRoot + this.id;
},
urlRoot: 'index.php?c=light&a=list_tasks_bb&ajax=true&task=',
parse: function (response, options) {
console.log(options);
console.log(response);
return response;
}
});
var TaskList = Backbone.Collection.extend({
model: Task,
url: 'index.php?c=light&a=list_tasks_bb&ajax=true',
initialize: function () {
},
parse: function (response, options) {
return response.tasks;
}
});
var Light = Backbone.Router.extend({
el: $('#light'),
routes: {
"tasks/:id": "taskAction",
"*page": "defaultAction",
},
initialize: function () {
_this = this;
this.tasks = new TaskList();
this.users = new UserList();
}, …Run Code Online (Sandbox Code Playgroud) 我有一个名为person的模特:
var person = Backbone.Model.extend({
initialize: function(){
console.log('cool');
},
defaults:{
names:['a','k','d','s','h','t']
}
})
Run Code Online (Sandbox Code Playgroud)
现在我有一个观点:
var person_view = Backbone.View.extend({
model : person,
output: function(){
console.log(this.model.get('names'))
}
});
Run Code Online (Sandbox Code Playgroud)
创建了视图的对象:
var obj = new person_view()
Run Code Online (Sandbox Code Playgroud)
尝试访问名称:
obj.output()
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误:
TypeError: Object function (){ parent.apply(this, arguments); } has no method 'get'
Run Code Online (Sandbox Code Playgroud)
你能告诉我如何正确地做事吗?我刚刚开始了解backbone.js所以请耐心等待我.
我有一个场景,fetch()模型的调用将返回一个数据,需要将属性传递给另一个API,并且该API的返回类型将是实际需要的数据.
var Issue = Backbone.Model.extend({
urlRoot: 'https://api.github.com/repos/ibrahim-islam/ibrahim-islam.github.io/issues',
parse: function(response, options){
var markdown = new Markdown({ text : response.body });
markdown.fetch({
contentType: 'application/json',
type: 'POST',
data: JSON.stringify( markdown.toJSON() ),
success: function(data){
response.body = data;
}
});
return response;
}
});
var Markdown = Backbone.Model.extend({
defaults:{
'text': '',
'mode' : 'markdown'
},
url: 'https://api.github.com/markdown'
});
Run Code Online (Sandbox Code Playgroud)
所以,当一个Issue将被取出:
var issue = new Issue({id: 1});
issue.fetch().then(function(){
//do stuff
});
Run Code Online (Sandbox Code Playgroud)
它将具有body包含markdown语法文本的属性,反过来我需要传递给另一个API并获取将传递给视图的响应.
从上面可以看出,我试图重写parse,但它的返回类型必须是一个对象,并fetch会async所以我能做些什么在这里,使这项工作?
注意:我知道聚合服务器中的数据然后接收它将是最好的想法,但这是不可能的atm.
如何知道在渲染函数中更改视图模型的哪个属性?(在渲染函数中,"e"是模型,但我只需要更改的属性.)我需要知道这个以了解要使用的模板.或者还有另一种方法吗?
window.Person = Backbone.Model.extend({});
window.Njerzit = Backbone.Collection.extend({
model: Person,
url: '/Home/Njerzit'
});
window.PersonView = Backbone.View.extend({
tagName: 'span',
initialize: function () {
_.bindAll(this, 'render');
this.model.bind('change', this.render);
},
render: function (e) {
//if model name is changed, I need to render another template
this.template = _.template($('#PersonTemplate').html());
var renderContent = this.template(this.model.toJSON());
$(this.el).html(renderContent);
return this;
}
});
Run Code Online (Sandbox Code Playgroud) 我有以下代码来创建一个集合的新模型.基础数据存储区是一个远程API:
var postCreationStatus = this.model.create(newPostModel, {
wait : true // waits for server to respond with 200 before adding newly created model to collection
}, {
success : function(resp){
console.log('success callback');
console.log(resp);
},
error : function(err) {
console.log('error callback');
console.log(err);
}
});
Run Code Online (Sandbox Code Playgroud)
创建了新模型,我可以从数据库中确认这一点,但是不会调用成功函数和错误回调函数.
创建完成后,我想重定向用户.过早地重定向会导致AJAX请求失败,这就是为什么我使用成功回调很重要的原因.
服务器以JSON响应{ id : 11 }和HTTP状态响应200 OK.
我有必须调用4的外部API如集合:http://www.abc.com,http://www.fgt.com,http://www.jkl.com和HTTP://www.rty .com.
我有一个名为Todos.js的Collection.有没有办法可以在一个集合中一起获取4个api,因为所有四个api都会为我提供相同的模型响应所以我从4 apis得到的响应具有相同的数据结构,即"name"和"link".
有没有办法可以在同一个集合中附加所有回复?实现这一目标的最佳方法是什么?
javascript jquery backbone.js backbone.js-collections backbone-model
我有一个模型听取发布事件"更新:TotalCost",当属于集合C的任何模型M发生变化时,它从(不相关的)集合C触发.
此事件在初始化方法中编码,如下所示.收到事件后,我收到以下错误:
TypeError:this.set不是函数 this.set({"totalsale":value});
CostModel = Backbone.Model.extend({
defaults: {
totalSale: 0,
totalTax: 0
},
initialize: function(attrs, options) {
if(options) {
if(options.vent) {
this.vent = options.vent;
}
}
this.vent.on("update:TotalCost", function(value) {
this.set({ "totalSale": value}); **//ERROR HERE**
});
}
});
Run Code Online (Sandbox Code Playgroud) javascript-events backbone.js underscore.js backbone-model marionette