【问题标题】:Using ng-grid with angularFire - key naming issues将 ng-grid 与 angularFire 一起使用 - 键命名问题
【发布时间】:2013-12-19 02:50:09
【问题描述】:

我现在已经玩了一点,但无法理解它:

(使用 angular 1.2.2、angularFire 0.5.0 和最新的 ng-grid)

所以我有一个 firebase,我正在使用 angularFire 将我的数据提取到一个 ng-grid 组件中,如下所示:

//First I go get my data, in this case something called 'grades' from ..../db/grades
    var promise = angularFire(new Firebase($scope.fireBaseUrl), $scope, 'grades');
//When they're fetched I start up a watcher
    promise.then(function(grades) {
    startWatchGrade($scope, filterFilter, appSettings);
});

//Then I bind that grades as a datasource to my ng-grid
$scope.gridOptions = { 
data: 'grades',
enableCellSelection: false,
enableRowSelection: true,
etc....,

效果很好,我已经完成了将新项目添加到“等级”(推送)和删除项目(拼接)的控件,并且所有内容都很好地反映到了 ng-grid。像这样:

//Adding new like this is ok
$scope.grades.push({some-new-data-here});

//Deleting old like this is ok
$scope.grades.splice(row.rowIndex, 1);

但是这种方法会自动生成基于 int 的 Firebase 键,这些键在修改时会一直发生变化,所以我想控制这些键,所以我更改了添加要使用的项目:

var fbRef = new Firebase($scope.fireBaseUrl);
var newRef = fbRef.push({some-items-here});

一切正常,使用我的非整数 id 将数据存储到 firebase 中,但它不再绑定到 ng-grid。将“成绩”转储到控制台会显示所有正在返回的行,但它不会显示在 ng-grid 中。

简而言之:angularFire 生成的基于整数的索引在 ng-grid 中可以正常工作,而由 firebase.push 创建的自定义字母数字则不行。

我希望这听起来不会太神秘。想过做一个小提琴,但让我们希望这是我忽略的一些“问题”并且很容易解决。如果没有,我会尝试修补一个。

谢谢!

【问题讨论】:

  • 角/角火版本?提示:1.2+ 有更好的相等性检查。另外,在这里尝试使用 angularFireCollection,您可能会更幸运地使用更新的数组(集合)而不是更新时替换的对象(angularFire)。
  • 谢谢,下次我在开发环境中时会试一试。
  • 不走运,小提琴就完美了。
  • 嘿蒂姆,查看 angularFire-seed tag 0.3 获取 0.3 的 angularFire 和 angularFireCollection 示例,或查看 the latest release 获取 $firebase 示例。
  • 可能是我,但我完全错过了您在第二种方法中如何绑定到您的“成绩”模型?

标签: angularjs firebase angular-ui ng-grid angularfire


【解决方案1】:

根据documentation,$firebase 总是返回对象,而不是数组,这在 ng-grid 中效果不佳。在这种情况下,angularfire 提供了一个过滤器来帮助,orderByPriority。确保将 $filter 注入到您的控制器中。

(注意:我没有使用 promises 或 watchers,只使用了 angularfire 的内置事件)

$scope.grades = $firebase(new Firebase($scope.fireBaseUrl));
$scope.gradesData=[];
$scope.gridOptions = { data: 'gradesData'}
$scope.grades.$on("loaded", function(data) {
    var arrData = $filter("orderByPriority")(data);
    $scope.$apply(function(){$scope.gradesData = arrData;});
});

您可以尝试对 $on.('change'...) 使用类似的方法来获取新行。

希望对你有帮助

【讨论】:

  • 无法看到它如何与“加载”事件一起工作......似乎回调不是数据本身,而只是添加或修改的项目的键(没有迹象表明这是AFAIK)。关于保持 AngularFire 的服务和 ng-grid 之间的双向绑定工作的最佳方式的任何想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多