在我的Angular(4 + Typescript)項目中,我使用了已經準備好的組件(自從擴展ControlValueAccessor的方式是一樣的,但是如果這個問題我用ng2-select),這是我想要的,因爲它具有更好的用戶體驗和更好的外觀。將它包含到我使用的反應形式的表單組件中後,我就可以在提交時返回(用於表單控件)基於在準備組件中使用的類SelectItem的對象來管理選定的項目 - 如下所示:Angular 4 ControlValueAccessor在提交和值更改事件上的值
// console.log(this.myForm.values)
Object {
txtInput: 'value',
// ...
preparedComponent: SelectItem { // <--
id: '1',
text: 'Chosen item'
}
}
由於構成要素基本上是標準選擇控制,我期待,我會回來形成串選擇項目的ID更換 - 這樣的:
// console.log(this.myForm.values)
Object {
txtInput: 'value',
// ...
preparedComponent: '1' // <--
}
我後瞭解了ControlValueAccessor的實際情況以及它的工作原理,我改變了提交內容的方式(或者更好地說改變了項目 - onChange
)到項目的ID。問題解決了一段時間,直到我開始設置預定義值(在編輯實例上)以形成控件而不是空值(添加實例時)。我發現這次writeValue
正在根據它作爲預定義值發送給它的內容來分配值來形成控件。所以在這我給預設值的情況下...
Object {
id: '1',
text: 'Chosen item'
}
...這也是上提交,就像在上面的第一個代碼示例中的對象的值。我爲此做了一個解決方法,在調用writeValue
之後立即分配正確的值來控制onChange
。這是做它的方式真的不合適,但我不能想出比其他任何東西:
public writeValue(val: any): void {
this.selectedItems = val; // val is for example Object { id: '1', text: 'Chosen item' }
setTimeout(() => {
this.onChange(val.id); // just an example of emitted value, there should be some checks val is object and id exists in real code
}, 0);
}
而這也工作了,只要我沒有訂閱開始形成控制的valueChanges
。問題在於,每次將預定義值分配給準備好的組件時,即使在使用{ emitEvent: false }
時,也會在提交後使用該值。
所以這是我想用處理準備好的組件來處理的事情,因爲我想從控制提交中獲得正確的價值,並且我不想讓訂閱者發生變化,直到值真的沒有改變,而不僅僅是替換爲預定義的值。任何想法如何處理這將不勝感激。
我有點經歷了這個確切的過程。我不完全確定我明白你的確切問題。 – Amit
問題主要是'writeValue'內'onChanges'。首先,因爲'setTimeout'實際上是我作爲解決方法做的最後一件事,其次是因爲它在用預定義值初始化時發出change事件。理想情況下,輸入和輸出值將被分開 - 輸入將接受對象,輸出將返回所選對象的ID。因此,不需要在init初始值上發生變化,因爲這不是預期的默認行爲(對於控制的setValue或者復位形式的'{emitEvent:false}')Angular不會發出事件當chaning值時)。 – user1257255
我相當有信心,這是更多的問題,因爲你(我也有)「戰鬥」ng2選擇(這幾乎沒有維護btw) – Amit