2014-09-01 127 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