代码之家  ›  专栏  ›  技术社区  ›  Vinyl Warmth

当Aurelia应用程序中的值更改时不触发事件

  •  1
  • Vinyl Warmth  · 技术社区  · 8 年前

    我有一个Aurelia应用程序正在使用 Store 管理组件之间的状态。

    在我的下拉组件中,我有一个验证(不是框架验证,只是在发生更改时在ViewModel中调用的代码),当值发生更改时,该验证将触发:

    <select value.bind="parameter.value"
            change.delegate="valueChanged()"
            class.bind="isValid ? '' : 'has-error'">
            ... 
    </select>
    

    在ViewModel中,验证的工作方式如下:

    @bindable() parameter: Parameter;
    
    parameterChanged() {
        this.validate();
    }    
    
    valueChanged() {
        this.validate();
    }
    
    private validate() {
        this.isValid = this.parameter.value != '0';
    }
    

    参数模型如下:

    export interface Parameter {
        value: string;   
        ...
    }
    

    这个 Parameter 由父组件传递给此组件,在父组件中,可以更改通过存储管理的状态对象的值。

    当调用以下操作以更改 State 对象:

    export async function changeValue(state: State, value: string) {
        const newState = Object.assign({}, state);
        newState.setup.parameter.value = value;
        return newState;
    }
    

    当状态对象上的参数值更改时,下拉列表在屏幕上会明显更改,但是 parameterChanged() 或 valueChanged() 不要开火。

    有人知道这里发生了什么事吗?有什么我能解决的吗?感谢任何帮助。。。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Vinyl Warmth    8 年前

    因为我在用 Aurelia Store 我应该使用状态更改订阅,如下所示:

    @connectTo({
        selector: {
            parameter: (store) => store.state.pipe(pluck("parameter"))
        }
    })
    
    parameterChanged() {
        this.validate();
    }
    

    这没有按预期工作的原因是:

    • valueChanged() 与 元素的 更改函数,因为值正在更改,所以不会触发。
    • parameterChanged() 不开火是因为 parameter 没有改变 value 财产 参数 正在改变
    推荐文章