使用 ui.grid 与 cellTemplate 共享 $scope
Sharing $scope with cellTemplate using ui.grid
我正在使用 ui.grid 获取部件列表。我创建了一个列,其中包含一个启动模式的按钮。我遇到的问题是共享行中包含的部分的范围。我想与我使用 cellTemplate 创建的按钮共享该行的属性。然后我想与它将启动的模式共享部分行的 $scope。
我对如何实际执行此操作有点困惑。
到目前为止我已经试过了
• 在我想要定位的按钮周围环绕一个 ng-repeat。这种工作但使应用程序超级慢
• 通过ng-class 在按钮上进行数据绑定。我似乎无法正确定位。
如何将您通过 $http.get 接收到的对象的 $scope 共享到 ui.grid 以及您使用 cellTemplate 创建的元素?
您可以使用外部范围在行选择或单击该行时访问行及其属性
ng-click="getExternalScopes().onRowClick(row)"
onRowClick: function (row) {
row.entity.Property1; /// and so on for all row properties
}
我使用 bootstrap $modal 指令和这样的代码...
clickFunction: function (event, row) {
event.stopPropagation(); // prevents the current row from appearing as selected
var modalInstance = $modal.open({
templateUrl: 'views/modalcontent.tpl.html',
controller: 'ModalMessageController',
size: 'lg',
resolve: {
message: function () { return row.entity.serial_number; }
}
}
);
那我就参考模板里的{{message}}
。当然你也可以传入任何其他数据。
免责声明 -- 我总是使用 controllerAs 语法,因此如果在 HTML 的上下文中引用控制器对您来说很奇怪,请忽略该部分并假装您将方法设置为直接在范围内。我也用 Typescript 做所有事情,而不是 Javascript,所以我将在这里编写代码的相关部分。它们应该很容易插入您的应用程序。
答案是您已经从 Sunil 和 S.Baggy 那里得到的两个答案的组合。
您要做的是使用 getExternalScopes() 函数并将某些内容附加到网格所在的 HTML 范围。你递给网格的东西将排在行中并调用你的模式弹出窗口。请参阅下面的说明。
你的HTML-
<div ng-controller="MyController as myController">
<div ui-grid="myController.GridObject" external-scopes="myController"></div>
</div>
通过使用 controllerAs 语法并使控制器成为外部作用域中的引用,我们现在可以访问控制器中的所有内容。所以我们可以调用其中的方法。然而,为了做到这一点,我们必须使用一个 cellTemplate,听起来您已经知道该怎么做,并且在该 cellTemplate 中我们必须具有以下内容:
ng-点击="getExternalScopes().methodToLaunchModal()"
现在连接所有这些的最后一部分是将 methodToLaunchModal() 方法写入控制器。为此,我们从 S.Baggy 的回答中借用了代码。这是一个带有 GridObject 的非常简短的控制器(与我在上面的控制器中引用的相同):
app.controller('MainCtrl', function($scope, $modal) {
GridObject = {
... setup of all the other things
columnDefs: [{ etc, etc, }, { etc, cellTemplate: '<div ng-click="getExternalScopes().methodToLaunchModal(row.entity)">whatever</div>' }]
};
methodToLaunchModal: function(row) {
var modalInstance = $modal.open({
templateUrl: 'someTemplate',
controller: 'ModalController',
resolve: {
rowObject: function () { return row; }
}
});
};
});
此时您的模态范围将有一个名为 rowObject 的对象,该对象将具有您行中的所有属性。所以你应该可以调用 rowObject.SomeProperty 来获取它的值。
如果有任何语法问题,我们深表歉意。
我正在使用 ui.grid 获取部件列表。我创建了一个列,其中包含一个启动模式的按钮。我遇到的问题是共享行中包含的部分的范围。我想与我使用 cellTemplate 创建的按钮共享该行的属性。然后我想与它将启动的模式共享部分行的 $scope。
我对如何实际执行此操作有点困惑。
到目前为止我已经试过了
• 在我想要定位的按钮周围环绕一个 ng-repeat。这种工作但使应用程序超级慢 • 通过ng-class 在按钮上进行数据绑定。我似乎无法正确定位。
如何将您通过 $http.get 接收到的对象的 $scope 共享到 ui.grid 以及您使用 cellTemplate 创建的元素?
您可以使用外部范围在行选择或单击该行时访问行及其属性
ng-click="getExternalScopes().onRowClick(row)"
onRowClick: function (row) {
row.entity.Property1; /// and so on for all row properties
}
我使用 bootstrap $modal 指令和这样的代码...
clickFunction: function (event, row) {
event.stopPropagation(); // prevents the current row from appearing as selected
var modalInstance = $modal.open({
templateUrl: 'views/modalcontent.tpl.html',
controller: 'ModalMessageController',
size: 'lg',
resolve: {
message: function () { return row.entity.serial_number; }
}
}
);
那我就参考模板里的{{message}}
。当然你也可以传入任何其他数据。
免责声明 -- 我总是使用 controllerAs 语法,因此如果在 HTML 的上下文中引用控制器对您来说很奇怪,请忽略该部分并假装您将方法设置为直接在范围内。我也用 Typescript 做所有事情,而不是 Javascript,所以我将在这里编写代码的相关部分。它们应该很容易插入您的应用程序。
答案是您已经从 Sunil 和 S.Baggy 那里得到的两个答案的组合。
您要做的是使用 getExternalScopes() 函数并将某些内容附加到网格所在的 HTML 范围。你递给网格的东西将排在行中并调用你的模式弹出窗口。请参阅下面的说明。
你的HTML-
<div ng-controller="MyController as myController">
<div ui-grid="myController.GridObject" external-scopes="myController"></div>
</div>
通过使用 controllerAs 语法并使控制器成为外部作用域中的引用,我们现在可以访问控制器中的所有内容。所以我们可以调用其中的方法。然而,为了做到这一点,我们必须使用一个 cellTemplate,听起来您已经知道该怎么做,并且在该 cellTemplate 中我们必须具有以下内容:
ng-点击="getExternalScopes().methodToLaunchModal()"
现在连接所有这些的最后一部分是将 methodToLaunchModal() 方法写入控制器。为此,我们从 S.Baggy 的回答中借用了代码。这是一个带有 GridObject 的非常简短的控制器(与我在上面的控制器中引用的相同):
app.controller('MainCtrl', function($scope, $modal) {
GridObject = {
... setup of all the other things
columnDefs: [{ etc, etc, }, { etc, cellTemplate: '<div ng-click="getExternalScopes().methodToLaunchModal(row.entity)">whatever</div>' }]
};
methodToLaunchModal: function(row) {
var modalInstance = $modal.open({
templateUrl: 'someTemplate',
controller: 'ModalController',
resolve: {
rowObject: function () { return row; }
}
});
};
});
此时您的模态范围将有一个名为 rowObject 的对象,该对象将具有您行中的所有属性。所以你应该可以调用 rowObject.SomeProperty 来获取它的值。
如果有任何语法问题,我们深表歉意。