2014-09-01 41 views
-2

我想創建一個可編輯的網格,其中有一個可編輯的dateField。只有當細胞被聚焦Bootstrap Datepicker與角JS問題(再次)

$scope.gridOptions = { 
      data: 'result', 
      enableCellSelection: true, 
      enableRowSelection: false, 
      enableCellEditOnFocus: true, 
      multiSelect: false, 
      columnDefs: [ 
       { field: 'name',  displayName: 'Name',    enableCellEdit: false, width: 60 }, 
       { field: 'age',  displayName: 'Age',     enableCellEdit: false, width: 60 }, 
       { field: 'sex',  displayName: 'Sex',     enableCellEdit: false, width: 90 }, 
       { field: 'dob',  displayName: 'DOB',     width: 150, 
        editableCellTemplate: '<input type="text" datepicker-popup="dd/MM/yyyy" is-open="true" ng-input="COL_FIELD" ng-model="COL_FIELD" datepicker-append-to-body=true />', 


       }         
      ] 
      }; 

editableCellTemplate,如果我不使用is-open="true",然後彈出不來的細胞將顯示爲可編輯的。如果我不使用ng-input="COL_FIELD",則焦點不會從任何單元格中移除。所以,datepicker沒有隱藏起來。但是如果我使用了兩個,那麼值就沒有被選中。在控制檯中的錯誤說Expression 'true' used with directive 'datepickerPopup' is non-assignable!

有關於此stackoverflow很多問題。我嘗試了幾乎所有,但沒有成功。

可以做些什麼?我怎樣才能刪除錯誤?請給我提供一個工作的重擊者。我無法與重擊者一起創建這個問題。

編輯

我想,我不能消除這種誤差。錯誤還是一樣

Expression 'true' used with directive 'datepickerPopup' is non-assignable!

我怎麼能刪除嗎?刪除它後,我相信它會起作用。我試着把它作爲一個範圍變量並引用它,但是當我使用Inspect元素檢查它時,值並沒有被替換爲true。如果我使用它作爲變量並連接像'is-open="' + $scope.dateFormat.opened + '"'這樣的模板中的值,仍然存在相同的錯誤。

編輯2

這是什麼is-open用於?在某處我看到它的價值等值於true,某處只是opened。在here in Stackoverflow其中的一個例子中,它只是opened1opened2。這是什麼?以及如何使用這個?

我已刪除使用bcombs技術

編輯3

進一步經過調試錯誤,我發現,日期選擇器是越來越打開(如果我使用由bcombs提及的方法),但是,它一旦開放就會關閉。

 $scope.$on('ngGridEventStartCellEdit', function() { 
     debugger; 
    }); 

編輯4 從多個操縱我得出的結論是 如果使用ng-input,那麼它打破了2路結合。即如果您更改日期值文本字段,則在datePicker中它會被反映出來,但是如果您嘗試使用datePicker更改該值,它將不會反映在textField中。

如果您刪除ng-input,這2種方式綁定,保持正確,所以它的工作原理,但這會導致ngGridEventEndCellEdit事件不被觸發。所以,重點不會迷失。值越來越選擇,datePicker越來越關閉(如果改爲enableCellEditOnFocus:true,我使用enableCellEdit:true),但焦點仍然在textField上..

需要幫助。希望更新有助於解決問題

+0

那麼你是說當你複製只是你認爲是一個笨拙的問題的代碼段,這個問題不顯示?如果是這樣的話,那麼問題就出現在你的代碼的其他地方。 – JoseM 2014-09-02 12:58:34

+0

@JoseM不,我的代碼甚至沒有工作,我甚至沒有得到同樣的東西在我的本地 – 2014-09-02 13:50:18

+0

@VivekVardhan你能提供一個plnkr作爲基礎嗎? – 2014-09-04 07:47:00

回答

3

我在引導指令或它們的角實現無專家......但直接回答如何去除錯誤的問題:我相當肯定,

is-open屬性不能是原始值。它需要是一個變量,它將保持這個特定的小部件是否處於打開狀態(布爾)。在我的代碼,我使用一個對象來保存這些標誌爲我所有datepickers,如:

openDatePickers:{}

然後,在cellTemplate串,我給它一個唯一的ID,例如:

'是開= 「openDatePickers [\ 'DOB _ {{} row.entity.name} \']」'

(請注意,我用 「名」 屬性,以滿足您的例子,但一個唯一的ID是首選)。響應

編輯評論:
的celltemplate有權訪問它的控制器範圍,所以最簡單的方法是簡單地聲明:
$ scope.openDatePickers = {};

至於這是如何工作的,它取決於你使用的代碼庫。
我使用angular-ui,並在第1140行的ui-bootstrap-tpls-0.8.0.js中可以看到指令在哪裏管理「is-open」屬性。
如果未提供該屬性,則該指令在內部使用閉包管理此標記,但行爲不同於提供的屬性爲IS時。賦值的工作方式在兩種情況下都很簡單:變量(無論是內部閉包還是在屬性中提供的閉包)都只是簡單地在狀態之間切換。

編輯迴應您的調試
至於重點件事:我不使用NG-輸入或enableCellEditOnFocus。我使用:
enableCellSelection:真
......和我們的客戶不希望現場的手工編輯被允許,所以我的輸入元素有:
NG-只讀=「真」

這應該是針對您的問題的功能性解決方法,只要您的用例不要求您允許對輸入字段進行手動編輯即可。

+0

中分享的更新和鏈接器鏈接您能詳細說明如何使用這個'openDatePickers:{}'嗎?在哪裏申報?以及這是如何工作的? (賦值)。正確地複製它不適用於我 – 2014-09-03 08:19:46