Binding 变化不';对于计算绑定,似乎不会触发

Binding 变化不';对于计算绑定,似乎不会触发,binding,polymer,Binding,Polymer,如果我为一个结构对象上的所有更改创建一个观察者,该观察者将被调用,除非绑定是对计算绑定中的值的更改 这是预期的行为吗?如果是这样,如何在计算绑定中捕获对属性的更改 例如: <link rel="import" href="../../bower_components/paper-input/paper-input.html"> <dom-module id="binding-test"> <template> <paper-input labe

如果我为一个结构对象上的所有更改创建一个观察者,该观察者将被调用,除非绑定是对计算绑定中的值的更改

这是预期的行为吗?如果是这样,如何在计算绑定中捕获对属性的更改

例如:

<link rel="import" href="../../bower_components/paper-input/paper-input.html">
<dom-module id="binding-test">

<template>
    <paper-input label="Not computed" value="{{myObject.prop1}}"></paper-input>
    <paper-input label="Computed" value="{{computeIt(myObject.prop2)}}"></paper-input>
</template>

<script>
    Polymer({
        is:"binding-test",

        properties: {
            myObject: {
                type: Object,
                notify: true,
                value: {
                    prop1: 1,
                    prop2: 2
                }
            }
        },

        observers: [
            'somethingChanged(myObject.*)'
        ],

        somethingChanged: function(changeRecord) {
            // This code is never executed when the Computed input field is changed
            console.log(changeRecord);
        },

        computeIt: function(value) {
            return value;
        }
    });
</script>
</dom-module>

聚合物({
是:“绑定测试”,
特性:{
myObject:{
类型:对象,
通知:正确,
价值:{
prop1:1,
prop2:2
}
}
},
观察员:[
'somethingChanged(myObject.*)'
],
somethingChanged:函数(changeRecord){
//当计算输入字段更改时,此代码永远不会执行
控制台日志(changeRecord);
},
计算机:函数(值){
返回值;
}
});

我可能会错,但我认为计算绑定是单向的,与计算属性相同

如果您真的想通知这样的纸张输入的更改,您可以收听
值更改
事件,然后在
上执行
notifyPath
/
设置
“myObject.prop2”

您甚至可以像这样定义复杂的输入(不过您需要创建自己的
日期输入
元素)-


社会保险号码
SSN无效!

上面的代码示例取自。您可以在Polymer的官方网站上阅读更多信息。

Justin,感谢您关注这一问题。是的,我认为你是对的,装订是一种方式。但是,我不确定监听值更改事件是否解决了问题,因为虽然事件包含更改的值,但它不包含任何关于需要更新的模型对象的内容。我可以为每个使用计算绑定的属性使用这些valueChanged方法中的一个,但是如果我的绑定在dom重复模板中,即使这样也不起作用-我不知道哪个项发生了更改(可能在UI元素上使用ID)。好吧,我不知道该属性可以是动态的,所以这不起作用。但是我的问题是,当需要直接编辑时,为什么它首先必须是一个计算属性呢?Justin,我有很多情况需要在输入控件中显示格式化的模型值。例如,我的应用程序中的模型对象将货币存储为长值,但我需要在输入字段中使用货币符号(逗号、小数点等)显示这些值。我对日期和其他值也有同样的看法。我认为这是很常见的。在Polymer 0.5中,表达式和过滤器(例如{{{firstName:user.firstName,lastName:user.lastName}| formatUserName}})很好地处理了这一点,但Polymer 1.0完全抛弃了这一点。如此悲伤!ChrisJustin,是的,使用自定义输入元素似乎就是答案。前缀和后缀对于我的特定用例来说似乎并不那么有用。您甚至可以构建自己的自定义输入。
<paper-input label="Computed" on-value-changed="valueChanged" value="{{computeIt(myObject.prop2)}}"></paper-input>

valueChanged: function(e) {
    this.set("myObject.prop2", e.detail.value);
}   
<paper-input label="revenue" type="number">
  <div prefix>$</div>
</paper-input>

<paper-input label="email">
  <div suffix>@email.com</div>
</paper-input>
<paper-input-container auto-validate>
   <label>Social Security Number</label>
   <ssn-input class="paper-input-input"></ssn-input>
   <paper-input-error>SSN invalid!</paper-input-error>
</paper-input-container>