开箱即用使用$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中描述的行为是目前可以实现的最佳行为?