使用JayData 1.3.4本地商品商店时避免全局泄露

时间:2014-01-07 14:32:12

标签: jaydata

开箱即用使用$data.Entity.extend定义的实体将可全局访问。例如在从JayData的主页Todo中取得的示例中,将泄漏。

// Case 1: local item store example from http://jaydata.org/ 
 $data.Entity.extend("Todo", {
     Id: { type: "int", key: true, computed: true },
     Task: { type: String, required: true, maxLength: 200 },
     DueDate: { type: Date },
     Completed: { type: Boolean }
 });

 console.log('Leaks Todo?', typeof window.Todo !== 'undefined');
 //Result: true 

在JayData论坛帖子中,我找到了$data.createContainer()的引用,可以在实体定义期间用作容器。在这种情况下,Todo2不会泄漏。

// Case2:  creating Todo2 in a container
$data.Entity.extend("Todo2", container, {
    Id: { type: "int", key: true, computed: true },
    Task: { type: String, required: true, maxLength: 200 },
    DueDate: { type: Date },
    Completed: { type: Boolean }
});

console.log('Leaks Todo2?', typeof window.Todo2 !== 'undefined');
//Result: false

不幸的是,在访问商店之后,即使实体本身与容器相关联,也会有全局泄漏的其他变量。

console.log('Before store access: Leaks Todo2_items?', 
            typeof window.Todo2_items !== 'undefined');
            //Result: false

$data('Todo2').save({ Task: 'Initialized Todo2'})

console.log('After store access: Leaks Todo2_items?', 
            typeof window.Todo2_items !== 'undefined');
            //Result: true

可以在http://jsfiddle.net/RainerAtSpirit/nXaYn/找到完整的小提琴。

在理想的世界中,为容器中运行的实体创建的每个变量都将与同一个容器相关联。是否有选项可以实现这一目标,或者Case2中描述的行为是目前可以实现的最佳行为?

0 个答案:

没有答案