【问题标题】:Aurelia, how to make optional bindingAurelia,如何进行可选绑定
【发布时间】:2017-03-08 05:47:12
【问题描述】:

Aurelia 是否支持可选绑定?我在任何地方都找不到这些信息。我遇到的问题是我有一个 title 属性,它可能会或可能不会填充到对象数组中。我使用repeat.fortitle.bind,但如果此属性不是对象数组的一部分,我根本不希望该属性存在。 Aurelia 有可能吗?

Bootstrap-Select 与空的title 一起使用时会引发错误。让Aurelia 即时创建属性将解决我的问题。

我目前的代码是这样的

<select class="selectpicker" value.bind="value" options.bind="options" disabled.bind="disabled">
<option repeat.for="option of options" model.bind="option"
        data-subtext.bind="option.subtext"
        title.bind="option.title">
        ${option.name}
</option>

在这个例子中,我想将data-subtexttitle 作为可选属性。这可行吗?

由于这是一个自定义元素,我尝试删除对象 delete this.element.titletitle 属性,但这似乎不起作用。我也尝试过使用 jquery,但还是没有运气。

【问题讨论】:

    标签: javascript aurelia


    【解决方案1】:

    我没有在很多情况下对此进行测试,但我认为您也可以创建自定义绑定行为,如下所示:

    export class OptionalBindingBehavior {  
      bind(binding, scope, interceptor) {
    
        binding.originalupdateTarget = binding.updateTarget;
        binding.originalTargetProperty = binding.targetProperty;
        binding.updateTarget = val => { 
          if (val === undefined || val === null || val === '') {
            binding.targetProperty = null;
          } else {
            binding.targetProperty = binding.originalTargetProperty;
          }
          binding.originalupdateTarget(val);   
        }
      }
    
      unbind(binding, scope) {
        binding.updateTarget = binding.originalupdateTarget;
        binding.originalupdateTarget = null;    
        binding.targetProperty = binding.originalTargetProperty;
        binding.originalTargetProperty = null;
      }
    }
    

    然后像这样使用它:

    <a href.bind="message & optional">${message}</a>
    

    【讨论】:

    • 如果我想在我的自定义元素中使用它,它是否必须是一个单独的类?如果没有任何东西传递给它(这是我想要的),那真的会完全删除 href 属性吗?
    • 这可用于任何属性,如果您只在特定的自定义元素中使用它,我会使用 Fabio Luz 提供的解决方案。在任何情况下都可以肯定地工作:-) 或者添加一个更改为自定义元素的值以进行绑定并删除或添加属性
    • 感谢您的建议,更改的值实际上是个好主意。我可能会试一试。您的绑定行为仍然很有趣,我可能会在代码的其他地方使用它。感谢您提供。
    • 请务必在使用前彻底测试绑定行为。我只是想知道是否可以做到:-)
    • 考虑到我有多个可能是可选的属性,这是迄今为止最好的方法。我也喜欢它在实施后的易用性。附带说明一下,我还可以传递一个映射结构(如果用户想从他的数组中使用不同的属性名称),比如mapping.bind="{ subtext: 'company', title: 'myTitle' },然后在我的自定义元素中我现在调用title.bind="option[getMappingProperty('title')] &amp; optional",它会拉正确的属性(如果填充,因为它是可选的)并且它是完美的。非常感谢,我对结果很满意:)
    【解决方案2】:

    只有当属性存在时,您才能使用生成title 属性的自定义属性。例如:

    export class OptionalTitleCustomAttribute {
    
      static inject = [Element];
    
      constructor(element) {
        this.element = element;
      }
    
      valueChanged(newValue) {
        if (newValue) {
          this.element.setAttribute('title', newValue);
        } else {
          this.element.removeAttribute('title');
        }
      }
    
    }
    

    运行示例:https://gist.run/?id=f7f89f35b62acb5b4f05ffe59be1880e

    【讨论】:

    • 有意思,和@customAttribute()一样吗?我还没有使用过这样的属性,所以我不确定如何在代码中使用它。它是否必须是一个单独的类,我如何在我的自定义元素类中使用它?您是否介意编写一段快速的代码来使用自定义元素进行演示。谢谢
    • 当您想要覆盖命名约定时,您应该使用@customAttribute。例如,当您创建一个名为OptionalTitleCustomAttribute 的类时,按照惯例,使用自定义属性的语法是optional-title。如果你使用my-optional-title 代替,你将不得不用@customAttribute('my-optional-title') 来装饰你的班级。回答你的第二个问题,是的,你可以在同一个js文件中定义它。检查我更新的要点。
    • 太好了,下班后我会试一试,当我得到它的工作时接受你的回答。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多