我正在使用PhoneGap LocalNotification插件,它允许我在特定时间设置本地通知。
LocalNotification插件的基本结构如下:
var notification = {
init: function () {
},
clear_all: function () {
notification.clear();
plugins.localNotification.add({
badge: 0,
});
},
alert_ten: function () {
var d = new Date();
d = d.getTime() + 10 * 1000; //60 seconds from now
d = new Date(d);
plugins.localNotification.add({
date: d,
repeat: 'daily',
message: varone + ' - ' + vartwo + '!',
hasAction: true,
badge: 1,
id: '1',
sound: 'horn.caf',
background: 'app.background',
foreground: 'app.running'
});
},
}
如果您查看通知的消息部分,它将包含以下varone + ' - ' + vartwo + '!'
。在页面加载时,varone
和vartwo
将从localStorage
项填充。然后我打电话给notification.alert_ten()
onLoad。
一切正常,但有一个例外:
当用户与某个div进行交互,即点击它时,会设置localStorage
个项目。然后,当加载应用程序时,它会检查以查看这些值,并在10秒后提醒消息,说this
和that
,它们从LS获取它们的值。
如果用户改变主意,并与更改LS项目的其他div进行交互,则LocalNotification仍然使用原始LS项目集运行。
这是可以预期的,因为JS会将变量缓存在函数中。我认为可行的解决方案是全局定义变量,高于var notification = {
,然后当用户与div交互时,更新变量以表示新变量。
全局变量:
var varone = localStorage.getItem("favorite");
var vartwo = localStorage.getItem("favorite-status").substr(2).toLowerCase();
...
更新了变量:
...
var varone = text;
var vartwo = favstatus;
...
函数notification.alert_ten()
仍然使用全局变量中定义的原始值运行,而不是更新的。
答案 0 :(得分:1)
您可以编写getter / setter函数。这只是一个概念证明,你可以添加你喜欢的任何方法。只需确保在要在对象内部的函数之间共享的任何属性之前添加this.
,或者要从对象外部访问。
var notification = {
setX : function (newX) {
this.x = newX;
},
getX : function () {
return this.x;
},
outputX : function () {
document.write('x is ' + this.x + '<br>');
}
}
初始化并使用:
notification.setX(42);
console.log(notification.getX());
或
notification[x] = 42;
console.log(notification[x]);
甚至
notification.x = 42;
console.log(notification.x);
所以你的代码可能就像(除了有趣的部分之外的所有部分)
var notification = {
getMessage: function() {
return this.message;
},
setMessage: function() {
this.message = localStorage.getItem("favorite") + ' - ' +
localStorage.getItem("favorite-status").substr(2).toLowerCase() + '!';
},
alert_ten: function () {
plugins.localNotification.add({
message: this.getMessage()
});
}
}
// After some event I guess
notification.setMessage();
// After some other event?
notification.alert_ten();