Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data binding 聚合省道:数据绑定整数值到字符串属性_Data Binding_Binding_Filter_Dart_Dart Polymer - Fatal编程技术网

Data binding 聚合省道:数据绑定整数值到字符串属性

Data binding 聚合省道:数据绑定整数值到字符串属性,data-binding,binding,filter,dart,dart-polymer,Data Binding,Binding,Filter,Dart,Dart Polymer,我正在尝试将整数绑定到字符串属性。确切地说,我正在尝试将已发布的整数变量绑定到文本输入元素的value属性 @公布的整数数据=0 显然,字符串的引用存储在一个整数中 我尝试使用过滤器解决此问题,但仍然可以使其正常工作: int整型(对象a){ int-ret=0; if(a是字符串){ 试一试{ ret=int.parse(a); }关于格式化异常捕获(e){ } }else if(a为int){ ret=a; } 返回ret; } 所以我改为不使用绑定。有人能提出一个更好、更有效的解决方

我正在尝试将整数绑定到字符串属性。确切地说,我正在尝试将已发布的整数变量绑定到文本输入元素的value属性

@公布的整数数据=0


显然,字符串的引用存储在一个整数中

我尝试使用过滤器解决此问题,但仍然可以使其正常工作:

int整型(对象a){
int-ret=0;
if(a是字符串){
试一试{
ret=int.parse(a);
}关于格式化异常捕获(e){
}
}else if(a为int){
ret=a;
}
返回ret;
}

所以我改为不使用绑定。有人能提出一个更好、更有效的解决方案吗?

这是针对聚合物=1.0的见我的另一个答案

HTML属性只存储字符串值。您可以做的是在设置值时使用getter/setter进行绑定和解析

@可观察
int数据;
@ComputedProperty('data')//尚未尝试此操作,但应能正常工作-请参阅上的注释http://japhr.blogspot.co.at/2014/08/whats-difference-between-attribute-and.html
@可观察
获取数据值=>数据;
设置数据值(val){
if(val==null){
数据=0;
}else if(val是num){
数据=val.toInt();
}else if(val是字符串){
data=num.parse(val,(v)=>0.toInt();
}否则{
数据=0;
}
}
或者使用转换器或自定义聚合物表达式
就像在书中解释的那样

替代方法 使用Dart聚合物1.0(也可以使用Dart聚合物0.16)

应用程序元素。省道

@HtmlImport('app\u element.html'))
库_template.web.app_元素;
导入'dart:html'作为dom;
导入“package:web\u components/web\u components.dart”显示HtmlImport;
进口“包装:聚合物/聚合物.dart”;
@聚合注册器('app-element')
类AppElement扩展了聚合关系{
AppElement.created():super.created();
@财产价值;
@属性字符串字符串值;
@可反射
valueInputHandler(dom.Event事件,[\u]){
var输入=(event.target作为dom.NumberInputElement);
var值=input.valueAsNumber;
如果(!value.isNaN&&!value.isInfinite){
set('intValue',value.toInt());
input.setCustomValidity(“”);
}否则{
//只是为了得到用于样式设置的`:invalid`伪类
setCustomValidity('不是数字');
}
}
}
app_element.html


输入:无效{
边框:3倍纯红;
}
stringValue:{{stringValue}}
intValue:{{intValue}}

对于聚合物1.0.0这对我来说效果很好

创建可重复使用的行为,或者只需将
convertToNumeric()
添加到聚合物元素中:

@HtmlImport('app_element.html')
library app_element;
import 'dart:html' as dom;
import 'package:web_components/web_components.dart' show HtmlImport;
import 'package:polymer/polymer.dart';

@behavior
abstract class InputConverterBehavior implements PolymerBase {
  @reflectable
  void convertToInt(dom.Event e, _) {
    final input = (e.target as dom.NumberInputElement);
    double value = input.valueAsNumber;
    int intValue =
        value == value.isInfinite || value.isNaN ? null : value.toInt();
    notifyPath(input.attributes['notify-path'], intValue);
  }
}
@PolymerRegister('app-element')
class AppElement extends PolymerElement with InputConverterBehavior {
  AppElement.created() : super.created();

  @property int intValue;
}
将行为应用于元素:

@HtmlImport('app_element.html')
library app_element;
import 'dart:html' as dom;
import 'package:web_components/web_components.dart' show HtmlImport;
import 'package:polymer/polymer.dart';

@behavior
abstract class InputConverterBehavior implements PolymerBase {
  @reflectable
  void convertToInt(dom.Event e, _) {
    final input = (e.target as dom.NumberInputElement);
    double value = input.valueAsNumber;
    int intValue =
        value == value.isInfinite || value.isNaN ? null : value.toInt();
    notifyPath(input.attributes['notify-path'], intValue);
  }
}
@PolymerRegister('app-element')
class AppElement extends PolymerElement with InputConverterBehavior {
  AppElement.created() : super.created();

  @property int intValue;
}
在元素的HTML中配置输入元素:

  • value
    绑定到属性:
    value=“[[intValue]]”
    以便在属性更改时更新输入元素
  • 设置事件通知,以便在input=“convertToNumeric”notify path=“intValue”上的值更改时调用转换器,其中
    intValue
    是要用数值更新的属性的名称
创建行为或将函数直接添加到元素中

@behavior
abstract class InputConverterBehavior implements PolymerBase {
  void convertToInt(value, String propertyPath) {
    int result;
    if (value == null) {
      result = null;
    } else if (value is String) {
      double doubleValue = double.parse(value, (_) => double.NAN);
      result =
          doubleValue == doubleValue.isNaN ? null : doubleValue.toInt();
    } else if (value is int) {
      result = value;
    } else if (value is double) {
      result =
          value == value.isInfinite || value.isNaN ? null : value.toInt();
    }
    set(propertyPath, result);
  }
}
这样,您可以使用与文本输入字段相同的标记

<input type="number" value="{{intValue::input}}">

或者,如果要延迟属性的更新,直到输入字段离开

<input type="number" value="{{intValue::change}}">