2014-02-20 18 views
0

我有一個自定義綁定,ko.bindingHandlers.editBinding,做了很多魔術的東西。其中一個是readonly參數,用於控制是否允許編輯引用的observable選項。自定義綁定viewmodel和controlsDescendantBindings不更新

<div data-bind="editBinding: { type: 'text', prop: OrderContactName, readonly: CurrentOrderSystemStatusID() != 1 }"></div>

的只讀的結合是比較新的,並通過外部事件在會話期間可以改變。所以,當它發生變化時,所有當前正在編輯的小部件都需要放棄所有更改並關閉並隱藏編輯功能。

我的自定義虛擬機有一個計算readonly,它不會更新時,它傳遞到依賴性,我不明白爲什麼。

self.readOnly = ko.computed(function() { 
     return ko.utils.unwrapObservable(valueAccessor().readonly) || false; 
    }); 

也很有趣:

self.toggleFunc = function() { 
     var isEditing, otherEditingVM, _ref; 
     //this works 
     //original coffeescript 
     //#if valueAccessor()?.readonly and ko.utils.unwrapObservable valueAccessor().readonly is true then return 
     //if (((_ref = valueAccessor()) != null ? _ref.readonly : void 0) && ko.utils.unwrapObservable(valueAccessor().readonly === true)) { 
     //this doesn't 
     if (self.readOnly()) { 
     return; 
     } 

基地標記

<div data-bind="editBinding: { type: 'text', prop: OrderContactName, readonly: CurrentOrderSystemStatusID() != 1 }"></div> 

當我移動到只讀它的工作原理視圖模型!爲什麼?不敲除評估內聯表達式來計算反正?

self.ShouldBeReadOnly = ko.computed(function() { return self.CurrentOrderSystemStatusID() === 0;}) 


    <div data-bind="editBinding: { type: 'text', prop: OrderContactName, readonly: ShouldBeReadOnly }"></div> 

我拉了一堆東西出來,並就您的觀賞樂趣一個漂亮的jsfiddle - http://jsfiddle.net/scaryman/QDgde/3/

編輯

淘汰賽只是不工作,我認爲它做的方式。如果我將邏輯移動到viewModel中的計算中,它可以工作(請參閱更新),並且如果我用ko.computed包裝內聯邏輯,它也可以工作。

<div data-bind="editBinding: { type: 'text', prop: OrderContactName, readonly: ko.computed(function() {return CurrentOrderSystemStatusID() != 1;}) }"></div> 

這仍然爲什麼下面的代碼在事件處理程序工作不給我解釋

//#if valueAccessor()?.readonly and ko.utils.unwrapObservable valueAccessor().readonly is true then return 
if (((_ref = valueAccessor()) != null ? _ref.readonly : void 0) && ko.utils.unwrapObservable(valueAccessor().readonly === true)) { 

回答

1

沒有。

  1. 工作

    //#如果valueAccessor()?只讀和ko.utils.unwrapObservable valueAccessor()。只讀爲真,那麼返回 如果(((_ref = valueAccessor())!=空_ref.readonly:?無效0)& & ko.utils.unwrapObservable(valueAccessor()只讀===真)){

這裏你的視圖模型已經獲得通過valueAccessor,值總是給實際模型狀態。如果您更改「只讀」,訪問者會提供新的價值。

  1. 不工作

    如果(self.readOnly()){

在這裏您可以訪問您的視圖模型計算出位 'readonly'。但是當你改變'readonly'的值時,這個計算的值不會被改變。你總是獲得第一價值。因爲這個計算沒有任何影響其價值的計算或觀察值。把警報('hey')放在你的readOnly計算中,你會發現當你改變'readonly'時沒有通知發生。

+0

感謝您的延伸解釋。 – scaryman

1

你是對的,淘汰賽不會評估內嵌表達式computeds,所以你必須包裝像CurrentOrderSystemStatusID()=== 0至計算我會嘗試解釋爲什麼下面的代碼工作,上面的代碼的表達,例如

readonly: ko.computed(function() { return CurrentOrderSystemStatusID() === 0; }) 
相關問題