【问题标题】:angularJs - won't show data until user types in search fieldangularJs - 在用户在搜索字段中输入之前不会显示数据
【发布时间】:2013-12-21 05:06:02
【问题描述】:

最终解决方案?看起来我的路由和控制器有点困惑。我的路由在我的控制器模块的文件中。我将我的 routeProvider 移动到主模块中,就像在教程示例中一样。我的控制器和我的 routeProvider 在同一个模块下。也许这让一切变得混乱。所以现在我在它自己的模块中有控制器,并且 routeProvider 在主模块下。这似乎已经解决了问题,而无需初始化搜索字段以强制绑定更新数据。

更新: 在页面加载时显示我的数据的解决方案是使用 旧版本 angularJs,或使用ng-Init 并将搜索字段初始化为空白。

我从 firebase 网站获取 JSON 数据以更新表格。我有一个有效的搜索字段。在我在搜索字段中输入内容之前,数据不会显示在表格中。我不知道为什么控制器完成获取数据后,数据不会立即显示在表格中。

注意:后端数据的链接现在已删除,我不想无限期地保留该数据库文件。

这里是 jsFiddle 代码的链接: Last Version jsFiddle

这是控制器的代码。

'use strict';
/* App Module */
// Create the module named 'testApp'
var testApp = angular.module('theTestApp', [
  'ngRoute',
  'testServices'
]);

'use strict';
/* Services */

var testServices = angular.module('testServices', []);

testServices.controller('CommonController',
    // function($scope, $http, $route) {
    function($scope, $http) {
    //access the customInput property using $route.current
    //var dbKey = $route.current.customInput;
    var dbKey = 'test-a-db-12345';
    var urlToDb = 'https://' + dbKey + '.firebaseio.com/rows/.json';
    $http.get(urlToDb).success(function(data) {
    $scope.UsedItems = data;
    });

});

如何让数据在加载后立即显示?

更新 1:我假设数据已经存在,但是在搜索字段中输入内容会触发过滤器,然后显示数据。它显示为已过滤。

更新 2:我正在阅读关于 $Watch 的内容,并且不断有事件循环在监听事件。当在搜索框中按下某个键时,如果发生更改,绑定 {{name}} 会更新。在这种情况下,搜索输入字段的内容已更改。所以这个问题似乎与绑定何时更新有关,而不是与数据是否被检索有关。

更新 3: 此版本的代码运行。它在呈现页面时加载数据。这是 jsBins 中的一个工作示例。

更新 4: 从 angularJs 1.2.0 版开始,行为发生了变化。 1.0.8、1.0.7 版会在页面加载时立即显示我的数据,1.2.0 版不会!我只是碰巧正在使用使用 1.0.7 的 jsBins,它开始工作了。直到我开始比较差异时才知道为什么。希望有办法让它在较新的版本中工作。

jsBins Working Example

【问题讨论】:

  • 如果你的控制器代码是你小提琴的一部分会更好。
  • 我将一个完整的工作副本放入 jsBins。 jsBins working code
  • 如果您将 Firebase 与 Angular 结合使用,请考虑使用 AngularFire:angularfire.com

标签: javascript html angularjs firebase


【解决方案1】:

问题是theSearch.Txt 是空的。而你正在过滤。我的猜测是 Angular 在那一刻决定不让任何东西通过,因此不显示任何东西。

你应该做什么:

用空格填充的字符串初始化变量。 (即'')

这是一个有效的jsFiddle

我在这里使用了 ngInit。但那是因为你决定链接?控制器而不是将其放入脚本标签中。我建议下次你宁愿花额外的精力粘贴它,因为使用ngInit 指令让我感觉像使用eval

【讨论】:

  • 可行,将:ng-init="theSearch.Txt = ' '" 添加到 DIV 元素。
  • 使用空格初始化搜索字段以更新数据绑定时出现问题。用户可能不会意识到那里有一个空白区域,如果用户在搜索后没有删除该空白区域,则原始数据不会返回显示所有记录。
  • 在文档中,用红色字母表示应该使用控制器来初始化作用域上的值,而不是 ng-init。这是一个引用,“ngInit 的唯一适当用途是为 ngRepeat 的特殊属性起别名”angularjs documentation
  • 尽管 ng-init 确实强制更新数据绑定,但我发现了问题,并且不需要使用 ng-init 解决方案。出于某种原因,我使用的 firebase 数据库破坏了更新。我想知道它是否与名称中的许多连字符有关?另外,我正在使用 routeProvider 来触发控制器,并且 routeProvider 位于错误的 .js 文件中。
  • 我在回答中确实告诉过你。
【解决方案2】:

试试

$scope.$apply(function(){
    $scope.UsedItems=data;
}

【讨论】:

  • 没用。 $http 的成功函数在 $apply 中已经被 Angular 调用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多