Backbone.js 铆钉,主干。视图和主干。集合
在过去的视图周中,我尝试了许多方法使铆钉与Backbone.view和Backbone.Collection一起工作。我在互联网上找到的例子涵盖了我所有的尝试。但是,我仍然没有成功 以下是我目前试图实现的挑战:Backbone.js 铆钉,主干。视图和主干。集合,backbone.js,rivets.js,Backbone.js,Rivets.js,在过去的视图周中,我尝试了许多方法使铆钉与Backbone.view和Backbone.Collection一起工作。我在互联网上找到的例子涵盖了我所有的尝试。但是,我仍然没有成功 以下是我目前试图实现的挑战: 使铆钉识别主干。收集并观察所有事件 使用Backbone.View作为铆钉的模板,该模板保存Backbone.Collection中所有对象的输入字段 使用所有这些,通过覆盖铆钉函数来实现铆钉的“.”-适配器,如网络上的许多示例所示 我的适配器源代码如下所示: var dot
- 使铆钉识别主干。收集并观察所有事件
- 使用Backbone.View作为铆钉的模板,该模板保存Backbone.Collection中所有对象的输入字段
- 使用所有这些,通过覆盖铆钉函数来实现铆钉的“.”-适配器,如网络上的许多示例所示
var dotAdapter = rivets.adapters[
'.'],
originalSubscribe =
dotAdapter.subscribe,
originalUnsubscribe =
dotAdapter.unsubscribe;
dotAdapter.subscribe = function (obj, keypath, callback) {
if (obj === undefined || obj === null) {
return;
}
// Subscribe model
if (obj instanceof Backbone.Collection) {
obj.on('add remove reset', function () {
callback(obj);
});
obj.on('change:' + keypath, function (
m, v) {
callback(v);
});
} else if (obj != null && obj instanceof Backbone.Model) {
obj.on('change:' + keypath, function (
m, v) {
callback(v);
});
obj.on('reset:' +
keypath, function (
m, v) {
callback(v);
});
} else {
originalSubscribe.apply(
this, arguments);
}
};
dotAdapter.unsubscribe =
function (obj, keypath,callback) {
if (obj === undefined || obj === null ) {
return;
}
// Unsubscribe model
if (obj instanceof Backbone.Collection) {
obj.off('add remove reset', function () {
callback(
obj);
});
obj.off('change:' + keypath, function (m, v) {
callback(v);
});
}
else if (obj instanceof Backbone.Model) {
obj.off('change:' + keypath, function (m, v) {
callback(v);
});
obj.off('reset:' + keypath, function (m, v) {
debugger;
callback(v);
});
} else {
originalUnsubscribe.apply(
this, arguments);
}
};
dotAdapter.read = function (obj,keypath) {
if (obj === null || obj === undefined ) {
return;
}
if (obj instanceof Backbone.Model) {
return obj.get(keypath);
}
else if (obj instanceof Backbone.Collection)
{
return obj.models;
} else {
return obj[keypath];
}
};
dotAdapter.publish = function (obj, keypath, value) {
if (value === "") {
value = null;
}
if (obj instanceof Backbone.Collection) {
obj.models = value;
}
else if (obj instanceof Backbone.Model) {
obj.set(keypath, value);
}
else {
obj[keypath] = value;
}
};
get: function(obj, keypath) {
if(obj instanceof Backbone.Model)
return obj.get(keypath);
return obj[keypath];
},
有人能告诉我正确的方向吗?我该如何覆盖铆钉的“.”-适配器,以使其与Backbone.Collection对象一起工作
在我的收藏中,我会有主干。模型对象,它们应该显示在相应的模板上。我对铆钉是新手。所以我在搜索适配器并尝试了你的代码。这对我有用。所以我把这个贴出来,这样可能会对像我这样的人有所帮助 我的html页面包含以下类似于“:”适配器的内容
<ul id='item-list'>
<li rv-each-contact="contacts:">
<a rv-href='contact:url' >{contact:Name}</a></br></br>
</li>
</ul>
为了使代码适用于“.”适配器,我更改了行
<li rv-each-contact="contacts:">
到
我强烈建议不要覆盖默认的
适配器
这可能会导致意外行为,例如,在我工作过的一个项目中,有人将
适配器改写为以下内容:
var dotAdapter = rivets.adapters[
'.'],
originalSubscribe =
dotAdapter.subscribe,
originalUnsubscribe =
dotAdapter.unsubscribe;
dotAdapter.subscribe = function (obj, keypath, callback) {
if (obj === undefined || obj === null) {
return;
}
// Subscribe model
if (obj instanceof Backbone.Collection) {
obj.on('add remove reset', function () {
callback(obj);
});
obj.on('change:' + keypath, function (
m, v) {
callback(v);
});
} else if (obj != null && obj instanceof Backbone.Model) {
obj.on('change:' + keypath, function (
m, v) {
callback(v);
});
obj.on('reset:' +
keypath, function (
m, v) {
callback(v);
});
} else {
originalSubscribe.apply(
this, arguments);
}
};
dotAdapter.unsubscribe =
function (obj, keypath,callback) {
if (obj === undefined || obj === null ) {
return;
}
// Unsubscribe model
if (obj instanceof Backbone.Collection) {
obj.off('add remove reset', function () {
callback(
obj);
});
obj.off('change:' + keypath, function (m, v) {
callback(v);
});
}
else if (obj instanceof Backbone.Model) {
obj.off('change:' + keypath, function (m, v) {
callback(v);
});
obj.off('reset:' + keypath, function (m, v) {
debugger;
callback(v);
});
} else {
originalUnsubscribe.apply(
this, arguments);
}
};
dotAdapter.read = function (obj,keypath) {
if (obj === null || obj === undefined ) {
return;
}
if (obj instanceof Backbone.Model) {
return obj.get(keypath);
}
else if (obj instanceof Backbone.Collection)
{
return obj.models;
} else {
return obj[keypath];
}
};
dotAdapter.publish = function (obj, keypath, value) {
if (value === "") {
value = null;
}
if (obj instanceof Backbone.Collection) {
obj.models = value;
}
else if (obj instanceof Backbone.Model) {
obj.set(keypath, value);
}
else {
obj[keypath] = value;
}
};
get: function(obj, keypath) {
if(obj instanceof Backbone.Model)
return obj.get(keypath);
return obj[keypath];
},
这导致其他开发人员无法访问模型中的直接属性(属性之外的属性
),这导致了一些奇怪的错误
出于这些原因,最好为特殊用例创建单独的适配器。此外,它们还可以通过查看绑定更容易地理解对象之间的关系,这在处理嵌套结构时非常有用
例如:users:roles.admin:priviledges.create//看到这一点,我们发现用户和管理员都是模型
下面是一个简单的例子,使用了铆钉.js文档中展示的:
由于对象是通过javascript中的引用传递的,所以对模型的更新将自动反映在集合中,无需担心让铆钉观察主干集合事件
铆钉.适配器[':']={
观察:函数(obj、键路径、回调){
obj.on('change:'+keypath,回调)
},
unobserve:函数(obj、键路径、回调){
obj.off('change:'+keypath,回调)
},
get:函数(obj、键路径){
返回对象get(keypath)
},
设置:功能(对象、关键路径、值){
对象集(键路径、值)
}
}
风险值数据=[{
姓名:“约翰”,
年龄:10
}, {
姓名:“约瑟夫”,
年龄:11
}, {
名称:“欢乐”,
年龄:12
}]
var userCollection=new Backbone.Collection(数据);
var View=Backbone.View.extend({
初始化:函数(选项){
this.render()
},
render:function(){
铆钉。捆扎(本节){
用户:这是我的收藏
});
}
});
var userView=新视图({
el:“#用户列表”,
集合:userCollection
});代码>
-
{用户:姓名}{用户:年龄}