Security News
Input Validation Vulnerabilities Dominate MITRE's 2024 CWE Top 25 List
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
@italentjs/italent-sidebar
Advanced tools
npm -g install bower grunt-cli
;git clone <项目地址>
;npm install
;bower install
;grunt server
在本地8000端口启动server,并在默认浏览器打开起始页面;用于简单地渲染一个模板。 其render方法会将模板与数据绑定,并将结果渲染至$el中。
MyView=Talent.ItemView.extend({
template: jst['home/index-page']
});
一组hash表,获取view对应模板内的dom元素。 如下例所示,render前,this.ui.checkbox为字符串;render后,为jquery对象。
ui:{
checkbox:"input[type=checkbox]"
},
,events:function(){
var events = {};
events['click ' + this.ui.checkbox] = 'clickHandler';
return events;
}
onRender: function() {
if (this.model.get('selected')) {
this.ui.checkbox.addClass('checked');
}
}
对model中发生的事件绑定相应的事件监听函数。
modelEvents: {
"change":"modelChanged"
}
对collection中发生的事件绑定相应的事件监听函数。
collectionEvents: {
"add":"modelAdded"
}
该方法用于处理向模板中传入的数据,它的返回值必须为json对象。 ItemView传入的model或collection数据不适合直接渲染时,可用该方法。
serializeData: function(){
return {
"some attribute": "some value"
}
}
该方法在render后执行。你可以向其中加入你希望在view render之后执行的代码。
包含一个模板和一个可迭代区域。可迭代区域中的每个条目由ItemView负责渲染。
var MyItemView = Talent.ItemView.extend({
template : Talent._.template('<li><%=text%></li>')
});
Talent.CompositeView.extend({
template : '<h1>Hello</h1><ul></ul>',
itemViewContainer : 'ul',
itemView: MyItemView
});
用于指定渲染每个迭代条目的视图类,其必须是ItemView的子类;必选参数;
用于指定迭代区域。该方法指定一个DOM节点,用来包含所有迭代条目。必选参数。
从compositeView中传入到itemView中的参数。
var MyItemView = Talent.ItemView.extend({
initialize: function(options){
console.log(options.foo); // => "bar"
}
});
Talent.CompositeView.extend({
template : jst['common/todo-composite'],
itemViewContainer : 'ul',
itemView: MyItemView,
itemViewOptions : {
foo : "bar"
}
});
当itemViewOptions中的值需要在运行时通过计算得出时,它也可以被定义为一个函数,必须返回一个对象。
Talent.CompositeView.extend({
itemViewOptions: functioin(model, index){
// 计算部分
return {
foo: "bar",
itemIndex: index
}
}
});
collection为空时在compositeView内渲染的视图类。
获取compositeView中所有的itemView
自定义itemView的实例化过程。
buildItemView: function(item, ItemViewType, itemViewOptions){
// 为ItemView构建最终的参数列表
var options = _.extend({model: item}, itemViewOptions);
// 实例化
var view = new ItemViewType(options);
return view;
}
自定义itemView实例插入到dom结点的过程。 默认情况下,compositeView把每个itemView添加到缓存元素中,在最后通过jQuery的.append方法把所有itemView添加到compositeView的el中。
Talent.CompositeView.extend({
//第一个参数是compositeView实例,
//第二个参数是当前itemView实例,
//第三个参数itemView对应的model在collection中的序号。
appendHtml: function(compositeView, itemView, index){
if (compositeView.isBuffering) {
//在事件重置和初始化渲染时缓存,减少向document插入元素的次数
compositeView.elBuffer.appendChild(itemView.el);
}
else {
//如果compositeView已经被渲染,
//直接把新的itemView添加到compositeView中
cmopositeView.$el.append(itemView.el);
}
}
});
close方法执行以下操作 :
view渲染完成后,对view对应的dom结构进行其它操作。
在view close后执行。
item实例即将被添加到compositeView之前执行。
onBeforeItemAdded: function(itemView){
//操作代码
}
item实例被添加到compositeView之后执行。
onAfterItemAdded: function(itemView){
//操作代码
}
当item实例从compositeView中移除时执行。
onItemRemoved: function(itemView){
// 操作代码
}
以下事件函数在相应事件发生时被调用。
MyView = Talent.CompositeView.extend({...});
var myView = new MyView();
myView.on("render", function(){
alert("the collection view was rendered!");
});
myView.on("colsed", function(){
alert("the collection view was closed!");
});
var MyCV = Talent.CollectionView.extend({
// ...
onBeforeItemAdded: function(){
// ...
},
onAfterItemAdded: function(){
// ...
}
});
var cv = new MyCV({...});
cv.on("before:item:added", function(viewInstance){
// ...
});
cv.on("after:item:added", function(viewInstance){
// ...
});
cv.on("item:removed", function(viewInstance){
// ...
});
具有若干可局部刷新的区域(region)
MyLayout = Talent.Layout.extend({
template: "#my-layout-template",
regions: {
menu: "#menu-bar",
content: "#main-content"
}
});
var myLayout = new MyLayout();
myLayout.render();
//myMenu在这里可以是ItemView或CompositeView的实例
myLayout.menu.show(myMenu);
定义Layout中的Region。通过函数定义,该函数返回一个定义Region的对象。
regions: function(options){
return {
fooRegion: "#foo-element"
};
}
渲染view并将它添加到el元素中。
向Layout中添加Region,一次只能添加一个。
var layout = new MyLayout();
// ...
layout.addRegion("foo", "#foo");
向Layout中添加Region,一次可以添加多个。
var layout = new MyLayout();
// ...
layout.addRegions({
foo: "#foo",
bar: "#bar"
});
移除Layout中的Region。
var layout = new MyLayout();
// ...
layout.removeRegion("foo");
用于将默认的Region类替换为你自定义的Region类。
MyLayout = Talent.Layout.extend({
regionType: SomeCustomRegion
});
也可以分别向每个region设置不同的Region类。
AppLayout = Talent.Layout.extend({
template: "#layout-template",
regionType: SomeDefaultCustomRegion,
regions: {
menu: {
selector: "#menu",
regionType: CustomRegionTypeReference
},
content: {
selector: "#content",
regionType: CustomRegionType2Reference
}
}
});
需要经常变动内部视图的区域。其最重要的特性为在改变内部视图后旧视图会从DOM中移除。
AppLayout = Talent.Layout.extend({
template: "#layout-template",
regions: {
menu: "#menu",
content: "#content"
}
});
var layout = new AppLayout();
layout.render();
layout.menu.show(new MenuView());
layout.content.show(new MainContentView());
设置绑定到Region中的view。该view不会渲染或显示。
var myView = new MyView({
el: $("#existing-view-stuff")
});
var region = new Talent.Region({
el: "#content",
currentView: myView
});
渲染并将view添加到DOM树中。每次调用show方法时会自动调用close关闭旧view。可以通过{preventClose: true}参数阻止close行为。
// 显示myView
var myView = new MyView();
MyApp.mainRegion.show(myView);
// anotherView替换掉myView。自动调用close方法
var anotherView = new AnotherView();
MyApp.mainRegion.show(anotherView);
// anotherView2替换anotherView。阻止调用close方法
var anotherView2 = new AnotherView();
MyApp.mainRegion.show(anotherView2, { preventClose: true });
自动关闭所有显示的view并删除缓存的el元素。region下一次显示view时,el重新从DOM中获取。
改变视图添加到region中的过程。 默认的open方法为:
Talent.Region.prototype.open = function(view){
this.$el.empty().append(view.el);
}
重写open方法添加其它效果
Talent.Region.prototype.open = function(view){
this.$el.hide();
this.$el.html(view.el);
this.$el.slideDown("fast");
}
向Region中添加view,添加的view不会渲染或显示。
MyApp.addRegions({
someRegion: "#content"
});
var myView = new MyView({
el: $("#existing-view-stuff")
});
MyApp.someRegion.attachView(myView);
当view已经渲染完成,但是尚未添加到DOM中时调用。
view渲染完成并添加到DOM中后调用。
当view被关闭之后调用。
MyApp.mainRegion.on("before:show", function(view){
// manipulate the `view` or do something extra
// with the region via `this`
});
MyApp.mainRegion.on("show", function(view){
// manipulate the `view` or do something extra
// with the region via `this`
});
MyApp.mainRegion.on("close", function(view){
// manipulate the `view` or do something extra
// with the region via `this`
});
MyRegion = Backbone.Marionette.Region.extend({
// ...
onBeforeShow: function(view) {
// the `view` has not been shown yet
},
onShow: function(view){
// the `view` has been shown
}
});
MyView = Talent.ItemView.extend({
onBeforeShow: function() {
// called before the view has been shown
},
onShow: function(){
// called when the view has been shown
}
});
当我们想在应用运行之后向其中添加region时,就要按照上文中的方法扩展Region类,并在应用中实例化,如下所示:
var SomeRegion = Talent.Region.extend({
el: "#some-div",
initialize: function(options){
// your init code, here
}
});
MyApp.someRegion = new SomeRegion();
MyApp.someRegion.show(someView);
注意region必须要有一个元素与自身绑定,如果在添加region实例到应用或Layout中时没有指定选择器的话,在定义时也必须声明el属性。
通过addRegions将自定义Region Type添加到应用中。
var FooterRegion = Talent.Region.extend({
el: "#footer"
});
MyApp.addRegions({
footerRegion: FooterRegion
});
也可以在添加时声明一个选择器。
var FooterRegion = Talent.Region.extend({
el: "#footer"
});
MyApp.addRegions({
footerRegion: {
selector: "#footer",
regionType: FooterRegion
}
});
FAQs
iTalent sidebar new
We found that @italentjs/italent-sidebar demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.
Research
Security News
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.