【问题标题】:Using $firebaseArray instead of Firebase Rest API使用 $firebaseArray 而不是 Firebase Rest API
【发布时间】:2015-10-13 19:32:06
【问题描述】:

您好,由于 Firebase 缺乏对数组存储的支持,我在从 Firebase 数据源过滤搜索结果时遇到问题,因此我使用 firebaseArray 作为替代方案。但是,由于它需要通过多个控制器访问,我必须将其变成工厂服务:

servicesModule.factory("dataArray", ["$firebaseArray",
  function($firebaseArray) {
    var ref = new Firebase("https://datasource.firebaseio.com/Articles");
     return $firebaseArray(ref);
  }
]);

然后我想创建一个搜索函数来过滤输入表单查询的结果:

//Get Posts
 servicesModule.factory('globalFilter', function() {
    return {
      searchText: ''
    };
  });

搜索输入:

<form>
          <div class="input-field">
            <input id="search" type="search" required ng-model="globalFilter.searchText">
            <label for="search"><i class="material-icons medium">search</i></label>
          </div>
    </form>

这是一个访问过滤器和数组工厂的示例控制器:

   controllersModule.controller('BlogCtrl', ["$scope",  "globalFilter",    function($scope, globalFilter, dataArray) {


     $scope.myArticles = dataArray;


   }]);

控制器的 ng-repeat 指令内的过滤器:

<div class="col s12 m6"  id="articleItems" ng-repeat="article in myarticles">
     <div class="card small">

       <div class="card-image waves-effect waves-block waves-light">
         <img class="activator" src="images/sample-1.jpg">
       </div>
       <div class="card-content">
         <span class="card-title activator grey-text text-darken-4">{{article.Title}}<i class="material-icons right">more_vert</i></span>
         <p><a href="#">Read More</a></p>
         <p>By: {{article.Author}} &nbsp; Published on: {{article.Published | date:'mediumDate'}}</p>
       </div>
       <div class="card-reveal">
         <span class="card-title grey-text text-darken-4">{{article.Title}}<i class="material-icons right">close</i></span>
         <div>{{article.Intro}}</div>
         <p ng-bind-html="article.Body">{{article.Body}}</p>
       </div>
   </div>
</div>

控制器通过.state渲染

控制器也是通过.state:`渲染的

  .state('Blog', {

   url: '/blog',
    controller: 'BlogCtrl as blg',
    templateUrl: 'blog.html',
    title: 'Blog'
  })`

我没有收到任何错误或结果。控制台为空白,文章未呈现。这在我使用 firebaseArray 之前有效。我的工厂出了什么问题?

【问题讨论】:

  • 你能把 HTML 贴在你使用 ng-repeat 的地方吗?
  • 由于某种原因,帖子没有呈现它。我刚刚调整了上面的间距,你就可以看到了。
  • 控制器也是通过.state渲染的,所以:` .state('Blog', { url: '/blog', controller: 'BlogCtrl as blg', templateUrl: 'blog.html' , 标题: '博客' })`

标签: arrays angularjs filter firebase


【解决方案1】:

如果您使用的是controllerAs,则需要将您的控制器变量绑定到this

controllersModule.controller('BlogCtrl', ["globalFilter", function(globalFilter, dataArray) {
    this.myArticles = dataArray;
}]);

您还需要在您的视图中将您的控制器称为blg。最后,myarticles 应该是 myArticles

<div class="col s12 m6"  id="articleItems" ng-repeat="article in blg.myArticles">

【讨论】:

  • 所有优秀的 cmets,谢谢,但仍然默默地失败。这很奇怪,因为在我看来,我有 {{blg.title}} 作为

    标题,并且从控制器设置“this.title =” My Blog Title”值可以很好地呈现,但不是数据源。还有如果我把它放回dataSource.query(function(posts){$scope.myPosts = posts;}),即使用API​​,即使使用$scope也能正常工作。这就是我认为firebaseArray服务有问题的原因。

  • 安全规则呢?
  • 不应该有其他控制器使用 firebaseArray (不是作为服务意识)示例:controllersModule.controller('WelcomeCtrl', ["$scope", '$location', ' CommonProp', "$firebaseAuth", '$firebaseObject','$firebaseArray', function($scope, $location, CommonProp, $firebaseAuth, $firebaseObject, $firebaseArray) { var ref = new Firebase('datasource.firebaseio.com/Posts'); var myPosts = $firebaseArray(ref); $scope.myPosts = myPosts;
  • 我不知道为什么它不起作用。如果没有看到更多代码,就无法诊断它。在这个 plunker 中工作正常:plnkr.co/edit/OsKaQU6kZf2MqrMSvGsJ?p=preview
  • 我需要在不是半夜的时候更仔细地看一下你的代码。但我首先注意到的是您将搜索输入放在视图控制器中。它必须是为了工作吗?
猜你喜欢
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
相关资源
最近更新 更多