你可以“监听”“actualstatus”的值何时发生变化,然后相应地更改颜色。你可以使用javascript的getter和setter来实现这一点。它们是与属性(actualstatus)相关联的两个函数,每当请求属性值(getter)和分配属性值(setter)时都会触发它们。
// this will trigger the getter function
var test = actualstatus;
// this will trigger the setter function
actualstatus=”1”;
重要的是,您可以使用setter函数更改actualstatus值...并且还可以触发形状颜色的更改。
以下是setter函数的示例:
function (newValue) {
this.currentValue = newValue;
switch(value){
case "0":
myKineticRect.setFill('lightgrey');
break;
case "1":
myKineticRect.setFill('yellow');
break;
default:
myKineticRect.setFill('red');
break;
}
layer.draw();
}
将getter/setter投入使用:
首先,声明一个对象,该对象将包含我们想要“监听”的所有变量。
// create a container object for all the Vars we want to "listen" to
var WatchedVars=function(){};
接下来,告诉WatchedVars添加一个名为“actualstatus”的变量,它将具有getter和setter:
Object.defineProperty(WatchedVars.prototype,"actualstatus",{
privateValue: "X",
get: function(){ return(this.privateValue); },
set: function(newValue){
this.privateValue=newValue;
actualstatusSetHandler(this.privateValue);
}
});
所以每当您更改actualstatus的值时,setter方法会被调用。
// assigning w.actualstatus a value of "1" triggers its setter function
w.actualstatus=”1”;
这个setter会将actualstatus的当前值更改为“1”。
这个setter同时会调用actualstatusSetHandler(),使矩形填充成黄色。
每当actualstatus的值发生变化时,都会执行这个回调函数:
function actualstatusSetHandler(value,isTrue){
switch(value){
case "0":
rect.setFill('lightgrey');
break;
case "1":
rect.setFill('yellow');
break;
default:
rect.setFill('red');
break;
}
layer.draw();
}
这就是如何在javascript中“监听”变量更改的方法!
这里有代码和一个Fiddle:
http://jsfiddle.net/m1erickson/Uw4Ht/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Prototype</title>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.5.1.min.js"></script>
<style>
#container{
border:solid 1px #ccc;
margin-top: 10px;
width:200px;
}
</style>
<script>
$(function(){
var WatchedVars=function(){};
Object.defineProperty(WatchedVars.prototype,"actualstatus",{
privateValue: "X",
get: function(){ return(this.privateValue); },
set: function(newValue){
this.privateValue=newValue;
actualstatusSetHandler(this.privateValue);
}
});
function actualstatusSetHandler(value,isTrue){
switch(value){
case "0":
rect.setFill('lightgrey');
break;
case "1":
rect.setFill('yellow');
break;
default:
rect.setFill('red');
break;
}
layer.draw();
}
var stage = new Kinetic.Stage({
container: 'container',
width: 200,
height: 200
});
var layer = new Kinetic.Layer();
stage.add(layer);
var rect = new Kinetic.Rect({
x: 30,
y: 30,
width: 100,
height: 30,
fill: "green",
stroke: "gray",
strokeWidth: 3
});
layer.add(rect);
layer.draw();
var w=new WatchedVars();
$("#set0").click(function(){ w.actualstatus="0"; });
$("#set1").click(function(){ w.actualstatus="1"; });
});
</script>
</head>
<body>
<div id="container"></div>
<button id="set0">actualstatus==0</button>
<button id="set1">actualstatus==1</button>
</body>
</html>
rect.on('yChange'...)
,但是在实际状态下似乎不像那样工作... :P - irie