观察者在聚合物中的怪异行为?
Weird behaviour of observers in polymer?
我有一个关于我的代码行为方式的问题列表,关于观察者
问题
1 - 为什么当我刷新页面时观察者会发出警报?
2 - 为什么我在刷新页面时收到两次警报?
3 - 为什么警报中的值不同,
a - 第一个警报 - [1,2,3,4,5]
b - 第二次警报 - 1,2,3,4,5
4 - 除非手动更改某些内容,否则我不知道被调用的观察者是什么,我不希望在页面刷新时调用它
5 - ::input
做什么?
自定义元素
<link rel="import" href="../bower_components/polymer/polymer.html">
<dom-module id="icon-toggle-second-demo">
<template>
<style>
</style>
<br>
<input type="text" value="{{first::input}}" >
second element
<button>Reset</button>
{{first}}
{{asdf}}
</template>
<script>
Polymer({
is: "icon-toggle-second-demo",
properties: {
'first': {
type: Array,
reflectToAttribute: true,
value: "[1,2,3,4,5]"
},
'second': {
type: String,
notify: true,
readOnly: false,
value: "default"
}
},
observers:[
'changedEvent(first.*, 0)', 'con()'
],
changedEvent: function(changeRecord, index){
alert(changeRecord.base);
},
con: function(){
console.log("asdf");
}
});
</script>
</dom-module>
PARENT HTML
<!doctype html>
<html>
<head>
<script src="../bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="icon-toggle-second-demo.html">
<style is="custom-style">
</style>
</head>
<body>
demo/index.html - parent <br>
<icon-toggle-second-demo ></icon-toggle-second-demo>
<script>
</script>
</body>
</html>
1 - 为什么我刷新页面时观察者会发出警报?
当绑定观察者时,Polymer 将调用一次观察者,因为您已经为其提供了一些默认值。
根据聚合物的文档
Simple observers are fired the first time the property becomes defined (!= undefined), and on every change thereafter, even if the property becomes undefined.
2 - 为什么我在刷新页面时收到两次警报?
这应该是因为当您要求 Polymer 将 属性 反映为属性时,它会尝试在属性和 属性 之间同步值。在 Array/Object 的情况下,因为属性中的值是不同的对象,那么在 属性 中,观察者被调用
3 - 为什么警报中的值不同,
这是因为第一次它被解释为字符串(根据您的值 属性 定义),第二次它被解释为数组(根据您的类型 属性)
4 - 除非手动更改某些内容,否则我不会调用观察者,我不希望在页面刷新时调用它
是的,这是可能的,您必须使用 simple observer 才能做到这一点
5 - ::input 有什么作用?
::input
帮助 Polymer 绑定 non-polymer
元素。由于非 Polymer 元素在值发生变化时不会通知 Polymer 使用此注释来标记需要观察的属性。
以下是我对您的代码的一些观察
- 为什么
first
的类型是 Array
?你将如何从输入标签中获取数组。据我所知,输入标签只会给你字符串作为输入
- 你为什么要使用
reflectToAttribute
。根据 Polymer 的文档 ReflectToAttribute
非常昂贵。所以在你有理由使用之前避免使用它
- 您不需要将属性名称放在引号中。应该是
first
而不是 'first'
- 您已将
first
命名为 Array
,但您已为其分配了 String
值。
- 您应该查看 Polymer 的文档或其他一些教程,以更好地了解如何使用 Polymer。
我有一个关于我的代码行为方式的问题列表,关于观察者
问题
1 - 为什么当我刷新页面时观察者会发出警报?
2 - 为什么我在刷新页面时收到两次警报?
3 - 为什么警报中的值不同,
a - 第一个警报 - [1,2,3,4,5]
b - 第二次警报 - 1,2,3,4,5
4 - 除非手动更改某些内容,否则我不知道被调用的观察者是什么,我不希望在页面刷新时调用它
5 - ::input
做什么?
自定义元素
<link rel="import" href="../bower_components/polymer/polymer.html">
<dom-module id="icon-toggle-second-demo">
<template>
<style>
</style>
<br>
<input type="text" value="{{first::input}}" >
second element
<button>Reset</button>
{{first}}
{{asdf}}
</template>
<script>
Polymer({
is: "icon-toggle-second-demo",
properties: {
'first': {
type: Array,
reflectToAttribute: true,
value: "[1,2,3,4,5]"
},
'second': {
type: String,
notify: true,
readOnly: false,
value: "default"
}
},
observers:[
'changedEvent(first.*, 0)', 'con()'
],
changedEvent: function(changeRecord, index){
alert(changeRecord.base);
},
con: function(){
console.log("asdf");
}
});
</script>
</dom-module>
PARENT HTML
<!doctype html>
<html>
<head>
<script src="../bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="icon-toggle-second-demo.html">
<style is="custom-style">
</style>
</head>
<body>
demo/index.html - parent <br>
<icon-toggle-second-demo ></icon-toggle-second-demo>
<script>
</script>
</body>
</html>
1 - 为什么我刷新页面时观察者会发出警报?
当绑定观察者时,Polymer 将调用一次观察者,因为您已经为其提供了一些默认值。 根据聚合物的文档
Simple observers are fired the first time the property becomes defined (!= undefined), and on every change thereafter, even if the property becomes undefined.
2 - 为什么我在刷新页面时收到两次警报?
这应该是因为当您要求 Polymer 将 属性 反映为属性时,它会尝试在属性和 属性 之间同步值。在 Array/Object 的情况下,因为属性中的值是不同的对象,那么在 属性 中,观察者被调用
3 - 为什么警报中的值不同,
这是因为第一次它被解释为字符串(根据您的值 属性 定义),第二次它被解释为数组(根据您的类型 属性)
4 - 除非手动更改某些内容,否则我不会调用观察者,我不希望在页面刷新时调用它
是的,这是可能的,您必须使用 simple observer 才能做到这一点
5 - ::input 有什么作用?
::input
帮助 Polymer 绑定 non-polymer
元素。由于非 Polymer 元素在值发生变化时不会通知 Polymer 使用此注释来标记需要观察的属性。
以下是我对您的代码的一些观察
- 为什么
first
的类型是Array
?你将如何从输入标签中获取数组。据我所知,输入标签只会给你字符串作为输入 - 你为什么要使用
reflectToAttribute
。根据 Polymer 的文档ReflectToAttribute
非常昂贵。所以在你有理由使用之前避免使用它 - 您不需要将属性名称放在引号中。应该是
first
而不是'first'
- 您已将
first
命名为Array
,但您已为其分配了String
值。 - 您应该查看 Polymer 的文档或其他一些教程,以更好地了解如何使用 Polymer。