【问题标题】:How can I get a single record from AngularFire collection synchronized from Firebase如何从与 Firebase 同步的 AngularFire 集合中获取单个记录
【发布时间】:2015-03-31 07:02:31
【问题描述】:

我无法从 AngularFire 同步数组中获取单个记录。

这是我的服务:

app.factory("Projects", ["$firebaseArray", function($firebaseArray) {
    // create a reference to the Firebase where we will store our data
    var ref = new Firebase("https://XXXXXXXXXX.firebaseio.com");
    var childRef = ref.child('projects');
    var projects = $firebaseArray(childRef);

    return {
        all: projects,

        create: function (projects) {
            return projects.$add(project);
        },
        get: function (projectId) {
            console.log(projectId);
            projects.$loaded().then(function(x) {
                var project = x.$getRecord(projectId);
                console.log(project); // This print null
            }).catch(function(error) {
                console.log("Error:", error);
            });
        },
        delete: function (project) {
            return projects.$remove(project);
        }
    };
  }
]);

这是我的控制器:

app.controller('ProjectViewCtrl', function ($scope, $routeParams, Projects, Auth) {
    $scope.project = Projects.get($routeParams.projectId);
});

这是我的看法:

<div>
 <p>{{project.creatorUID}}</p>
 <p>Project ID: {{project.$id}}</p>
</div>

<a class="btn button" ng-href="#!/">Back to Dashboard</a>

我可以拉出详细项目至路由,但我看不到任何内容或数据。

【问题讨论】:

    标签: firebase angularfire


    【解决方案1】:

    从语义上讲,该服务创建了一个 API,该 API 返回 $firebaseArray 上已有的相同方法。根本不需要这个服务,因为它没有提供额外的功能,也没有抽象任何复杂性。它可以很容易地简化为:

    app.factory("Projects", function($firebaseArray) {
        // create a reference to the Firebase where we will store our data
        var ref = new Firebase("https://XXXXXXXXXX.firebaseio.com").child('projects');
        return $firebaseArray(ref);
    });
    

    由于方法已经在内部调用了 $add、$delete 等,因此被调用者可以使用这些方法来代替包装方法。

    继续关于通过键查找特定记录的问题,这可以使用数组上的$getRecord 方法来完成。然而,这很可能不是您想要的。您没有在此处提供用例,这极大地限制了我们如何解决您的预期设计(请参阅XY problem),但您的代码表明您只需要一条记录而不是数组。这应该使用$firebaseObject 来完成,而不是尝试同步列表然后从列表中提取单个项目:

    app.factory('Record', function($firebaseObject) {
       var baseRef = new Firebase('...').child('projects');
       return function(recordId) {
          return $firebaseObject(baseRef.child(recordId));
       }
    });
    

    现在可以像这样简单地获取表示任何记录的同步对象:

    app.controller('...', function(Record) {
       var rec = Record( 'foobar123' );
    });
    

    另一个常见的用例是创建一个列表,您可以在其中单击一个项目,然后编辑该特定项目的内容,并将它们保存回 Firebase(即某种可编辑的网格/列表视图)。这已经可以完成,无需对数组中已有的内容进行任何不自然和重复的同步:

    <ul>
      <li ng-repeat="rec in list">
         {{rec.$id}}: {{rec.name}}
         <button ng-click="pickItem(rec)">select</button>
      </li>
    </ul>
    
    <form ng-show="selectedRec">
      <input ng-model="selectedRec.field" 
             ng-change="list.$save(selectedRec)" />
    </form>
    

    还有控制器:

    $scope.list = $firebaseArray(...);
    $scope.pickItem = function(rec) {
      $scope.selectedRec = rec;
    };
    

    【讨论】:

    • 感谢加藤的帮助。是的,我希望获得我创建的项目的详细视图,其中可能包含名称、描述、日期等字段。我希望能够选择一个项目并编辑这些详细信息,然后将它们保存到 firebase .我可以添加项目并在页面上列出这些项目,但我想转到其中一个项目的详细信息页面并编辑详细信息。
    • 酷,这个答案的第二部分应该涵盖你的用例。
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 2015-11-11
    • 2019-10-13
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多