我目前正在轮询服务器以检查新数据,然后相应地更新 AngularJS 应用程序中的模型。他大致就是我在做什么:
setInterval(function () {
$http.get('data.json').then(function (result) {
if (result.data.length > 0) {
// if data, update model here
} else {
// nothing has changed, but AngularJS will still start the digest cycle
}
});
}, 5000);
这工作正常,但大多数请求不会导致任何新数据或数据更改,但 $http 服务并不真正知道/关心并且仍会触发摘要周期。我觉得这是不必要的(因为摘要循环是应用程序中最繁重的操作之一)。 有没有办法仍然可以使用 $http,但如果没有任何更改,则以某种方式跳过摘要?
一个解决方案是不使用 $http 而是使用 jQuery,然后调用 $apply 让 Angular 知道模型已经改变:
setInterval(function () {
$.get('data.json', function (dataList) {
if (dataList.length > 0) {
// if data, update model
$scope.value = dataList[0].value + ' ' + new Date();
// notify angular manually that the model has changed.
$rootScope.$apply();
}
});
}, 5000);
虽然这似乎可行,但我不确定这是个好主意。如果可能的话,我仍然想使用纯 Angular。
有人对改进上述方法或完全更优雅的解决方案有任何建议吗?
附言我使用 setInterval 而不是 $timeout 的原因是因为 $timeout 也会触发摘要循环,这在这种情况下是不必要的,只会增加“问题”。
最佳答案
AngularJS 建议使用 PERF 技巧,通过 $httpProvider 将几个 $http 响应捆绑在一个 $digest 中。同样,这并不能解决问题,它只是一种镇静剂:)
$httpProvider.useApplyAsync(true)
首先,公认的解决方案不可扩展 - 你不可能在 10 万行 JS 代码项目上使用 $watchers 技巧 - 这是不可能的。
其次,即使项目很小,也风险很大!例如,如果另一个 ajax 调用实际上需要那些观察者,会发生什么?
在不修改 AngularJS 代码的情况下实现此目的的唯一替代方法是将 $rootScope.$$phase 设置为 true 或 '$digest',进行 $http 调用,然后将 $ rootScope.$$phase 为空。
$rootScope.$$phase = true;
$http({...})
.then(successcb, failurecb)
.finally(function () {
$rootScope.$$phase = null;
});
风险:
1) 其他 ajax 调用可能会尝试做同样的事情 --> 它们需要通过包装 ajax 服务(通过 $http)进行同步
2) 用户可以在两者之间触发 UI 操作,将 $$phase 更改为 null 的操作以及 ajax 调用何时返回,并且仍然触发 $digest
扫描 AngularJS 源代码后弹出的解决方案 - 这是保存情况的行:https://github.com/angular/angular.js/blob/e5e0884eaf2a37e4588d917e008e45f5b3ed4479/src/ng/http.js#L1272
因为这是每个人使用AngularJS都会遇到的问题,所以我觉得需要系统的去解决。上面的答案没有解决问题,只是想避免它。 因此我们应该创建一个 AngularJS 拉取请求,它允许我们通过 $httpProvider 指定一个不会触发特定 $http 请求的摘要的配置。希望他们同意需要以某种方式解决这个问题。
关于javascript - 如果 $http.get() 导致没有新数据,则使 AngularJS 跳过运行摘要循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21935215/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow