这是一个例子.假设我希望像许多网站一样覆盖图像.因此,当您单击缩略图时,整个窗口上会出现黑色叠加层,并且图像的较大版本将居中.点击黑色叠加层即可解散它; 单击图像将调用显示下一个图像的功能.
html:
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
<img src="http://some_src" ng-click="nextImage()"/>
</div>
Run Code Online (Sandbox Code Playgroud)
javascript:
function OverlayCtrl($scope) {
$scope.hideOverlay = function() {
// Some code to hdie the overlay
}
$scope.nextImage = function() {
// Some code to find and display the next image
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,这种设置,如果你点击图片,都nextImage()与hideOverlay()被调用.但我想要的只是nextImage()被召唤.
我知道你可以在这个nextImage()函数中捕获和取消事件,如下所示:
if (window.event) {
window.event.stopPropagation();
}
Run Code Online (Sandbox Code Playgroud)
...但我想知道是否有更好的AngularJS方法,不需要我使用此片段为叠加层内的元素添加所有函数的前缀.
我正在观看这个 AngularJS教程,该教程描述了如何使用Angular资源挂钩到Twitter.(视频教程)以下是示例控制器中设置的资源:
$scope.twitter = $resource('http://twitter.com/:action',
{action: 'search.json', q: 'angularjs', callback: 'JSON_CALLBACK'},
{get: {method: 'JSONP'}});
Run Code Online (Sandbox Code Playgroud)
该教程显示有几种方法可以使用get调用从资源中恢复数据.第一种方法是将回调传递给get函数.在ajax请求返回后,将使用结果调用回调:
$scope.twitter.get(function(result) {
console.log('This was the result:', result);
});
Run Code Online (Sandbox Code Playgroud)
我理解这种方法.这对我来说非常有意义.资源代表Web上可以获取数据的位置,get只需对URL进行ajax调用,返回json,并使用json调用回调函数.这个result参数是json.
这对我来说很有意义,因为很明显这是一个异步调用.也就是说,在引擎盖下,ajax调用会触发,并且调用后的代码不会被阻止,它会继续执行.然后在稍后的某个不确定点,当xhr成功时,调用回调函数.
然后教程显示了一个看起来更简单的不同方法,但我不明白它是如何工作的:
$scope.twitterResult = $scope.twitter.get();
Run Code Online (Sandbox Code Playgroud)
我假设下面的xhr get必须是异步的,但在这一行中我们将get调用的返回值赋给变量,就像它同步返回一样.
不理解这个我错了吗?怎么可能?我觉得它很有效,但是我觉得它不行.
我的理解是get可以返回的东西,而在其下方XHR熄灭和流程异步,但如果你自己遵循的代码示例,你会看到,$scope.twitterResult在执行任何后续行之前得到的实际Twitter的内容.例如,如果您console.log($scope.twitterResult)在该行之后立即写入,您将在控制台中看到来自twitter的结果,而不是稍后替换的临时值.
更重要的是,因为这是可能的,我如何编写利用相同功能的Angular服务?除了ajax请求之外,还有其他类型的数据存储需要可以在JavaScript中使用的异步调用,我希望能够以这种方式同步编写代码.例如,IndexedDB.如果我能够了解Angular的内置资源是如何做到的,我会试一试.
我正在尝试构建一个Flutter应用程序,该应用程序使用OAuth连接到另一个网站上的用户帐户.这需要导航到站点的OAuth页面,用户可以在其中输入凭据,然后解析用户返回时发送回应用程序的代码.
所以我的问题是:
1)如何导航到OAuth网页?
我已经发现我可以导航到这样的内部路线:
Navigator.of(context).pushNamed('/some_page');
Run Code Online (Sandbox Code Playgroud)
但是,如果我想去外部页面https://coolsite.com/oauth/authorize怎么办?
如何在(a)打开本地Web浏览器中的URL,以及(b)使用应用程序内Web视图?
2)我应该在验证后将用户重定向到哪个URL,以便他们返回到应用程序,以及如何解析响应?
似乎有两种方式:
(a)让用户被重定向到一个空白页面,其中包含URL和页面标题中的授权代码.如果这个方法 - 我如何解析页面或网址?
(b)将用户重定向到某种方案,例如my-dart-app://coolsite-oauth?code=xyz". If this method - how do I register the scheme, and wouldcoolsite-oauth map to a route that I specify when callingnew MaterialApp`,或其他地方?我将如何解析查询参数?
我正在关注Flutter入门指南并在运行实际flutter命令时卡住:
flutter init -o my_app
Resolving dependencies...
Error on line 17, column 16 of pubspec.yaml: Invalid version constraint: Could not parse version "^1.4.0". Unknown text at "^1.4.0".
stack_trace: ^1.4.0
^^^^^^
Unhandled exception:
Uncaught Error: FileSystemException: Cannot open file, path = '/Users/craig/Code/flutter/packages/flutter_tools/packages/sky_tools/executable.dart' (OS Error: No such file or directory, errno = 2)
Stack Trace:
#0 _File.open.<anonymous closure> (dart:io/file_impl.dart:349)
#1 _RootZone.runUnary (dart:async/zone.dart:1151)
#2 _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:496)
#3 _Future._propagateToListeners (dart:async/future_impl.dart:579)
#4 _Future._completeWithValue (dart:async/future_impl.dart:339)
#5 _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:401)
#6 _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41) …Run Code Online (Sandbox Code Playgroud) 假设我有一个看起来像这样的指令:
directive('attachment', function() {
return {
restrict: 'E',
controller: 'AttachmentCtrl'
}
})
Run Code Online (Sandbox Code Playgroud)
这意味着我可以像这样写一个'attachment'元素列表:
<attachment ng-repeat="a in note.getAttachments()">
<p>Attachment ID: {{a.id}}</p>
</attachment>
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,我们假设note.getAttachments()返回一组简单的javascript对象哈希值.
因为我为指令设置了一个控制器,所以我可以内联调用该控制器的作用域函数.
这是控制器:
function AttachmentCtrl($scope) {
$scope.getFilename = function() {
return 'image.jpg';
}
}
Run Code Online (Sandbox Code Playgroud)
这里是修改后的HTML,当我们包含$scope.getFilename对内联函数的调用时(新的第2段):
<attachment ng-repeat="a in note.getAttachments()">
<p>Attachment ID: {{a.id}}</p>
<p>Attachment file name: {{getFilename()}}
</attachment>
Run Code Online (Sandbox Code Playgroud)
但是,这没用.这将只打印相同的字符串"image.jpg"作为每个附件的文件名.
实际上,附件的文件名基于附件ID.因此ID为"2"的附件的文件名为"image-2.jpg".
所以我们的getFilename功能需要修改.我们来解决它:
function AttachmentCtrl($scope) {
$scope.getFilename = function() {
return 'image-' + a.id + '.jpg';
}
}
Run Code Online (Sandbox Code Playgroud)
但是等等 - 这不会奏效.a范围内没有变量.我们可以使用变量a内联ng-repeat …
在javascript中,如果我有3个这样的变量:
var x = 1
var y = 'cat'
var z = {color: 'blue'}
Run Code Online (Sandbox Code Playgroud)
我可以像这样记录所有这些:
console.log('The values are:', x, y, z)
Run Code Online (Sandbox Code Playgroud)
在dart中,你可以在编译的javascript中import 'dart:html'映射print到它console.log.但print只需要一个参数 - 而不是3.当编译的js在浏览器中运行时,这个dart会失败:
print('The values are:', x, y, z)
Run Code Online (Sandbox Code Playgroud)
我唯一能想到的就是将这些参数字符串化并将它们连接成一个字符串,并打印出来.但后来我失去了Chrome扩展打印到控制台的对象的能力.
是否可以使用一个print语句(或类似语句)打印多个对象?如果是这样,怎么样?
假设我有一个域名,media.coolsite.com. 还说我在 Google Cloud Storage 中有一个同名的存储桶。我还正确设置了 cname,这样当我media.coolsite.com在浏览器中访问时,它就会呈现index.html在存储桶中。
01.mp3该存储桶还包含一个我正在尝试获取其签名 URL 的文件。我可以使用以下代码来做到这一点:
gcloud = Gcloud.new
storage = gcloud.storage
bucket = storage.bucket 'media.coolsite.com'
file = bucket.file '01.mp3'
signed_url = file.signed_url
Run Code Online (Sandbox Code Playgroud)
这会返回一个类似这样的 URL:
https://storage.googleapis.com/media.coolstuff.com/01.mp3 ?GoogleAccessId=...&Expires=...等...
但我想要的是这样的 URL:
http://media.coolstuff.com/01.mp3 ?GoogleAccessId=...&Expires=...等...
请注意不同的主机:media.coolstuff.com而不是storage.googleapis.com.
我怎样才能使用宝石做到这一点gcloud?
我可以成功地做到这一点:
gcr.io/my-project/my-container)我现在正在尝试更复杂的构建,我认为下一步是使用 Google Compute Engine。
首先,我只是尝试部署我部署到 Cloud Run 的同一应用程序的单个实例:
Compute Engine > VM Instancesgcr.io/my-project/my-container
GCE 创建它需要一分钟,然后它会显示绿色复选标记和实例名称,以及“外部 IP:35.238.xxx.xxx”。我在浏览器中访问该 URL 并得到...“35.238.xxx.xxx 拒绝连接。”
为了进行检查,我返回 GCE 页面并选择我的实例旁边的“SSH > 在浏览器窗口中打开”,这会向机器打开一种云终端。
在此终端窗口中,键入ps并查看没有进程正在运行。容器Dockerfile以 结尾CMD yarn start:prod,所以我想这不会发生在这里。
此外,我ls在这里和那里四处导航,发现/app我Dockerfile的WORKDIR …
这是我之前的AngularJS问题的后续内容.
我正在尝试复制本视频教程中提到的$ resource服务的功能:link.
在本教程中,显示您可以使用异步调用更新范围变量及其视图.首先,这是设置的资源:
$scope.twitter = $resource('http://twitter.com/:action',
{action: 'search.json', q: 'angularjs', callback: 'JSON_CALLBACK'},
{get: {method: 'JSONP'}});
Run Code Online (Sandbox Code Playgroud)
然后在get资源上调用该函数以进行ajax调用并更新必要的范围变量:
$scope.twitterResult = $scope.twitter.get();
Run Code Online (Sandbox Code Playgroud)
这里发生的是$scope.twitter.get()立即返回一个空对象引用.然后,当ajax请求返回时,该对象将使用来自Twitter的数据进行更新.该视图然后更新所有{{twitterResult}}实例,您将看到返回的数据.
我没有得到的是,当在异步回调中更新对象时,范围如何知道值已经改变了?
我不认为它 - 回调必须在范围上调用某种更新功能,对吧?但如果是这样,这是怎么做到的?我听说过一个$apply可能是答案的函数- 但是如何从资源内部引用$ scope.$ apply()?
我创建了一个JSFiddle来说明问题:http://jsfiddle.net/Qcz5Y/10/
(编辑:这是一个较新的JSFiddle,它有一个不同的异步调用来说明使用ajax调用而不是setTimeout的问题:http://jsfiddle.net/Qcz5Y/14/)
在此示例中,您将看到控制器和资源.控制器的作用域有一个属性fruit,它开始设置为一个对象.单击"获取新水果"时,该属性设置为fruitResource.get(),立即返回空对象.然后进行异步调用,最后执行一个回调,更新最初返回的对象的值.
发生这种情况时,值$scope.fruit会正确更新为回调中设置的值.但它没有反映在视图中.
如果单击"打印当前水果",它将在控制台中记录当前值$scope.fruit.这只是为了检查; 它有更新视图的副作用.
我觉得我需要做一些像$ scope这样的东西.$ apply()在get_callback函数的底部(你会在代码中看到它).这是正确的做法吗?如果是这样,我如何获得fruitResource中$ scope的引用?我知道我大概可以传递$scope到fruitResource.get()作为参数,然后引用它这种方式,但在顶部提到的例子中,$ resource.get()函数并不需要做到这一点,所以我希望AngularJS提供了一些方法从服务中自动获取范围.
谢谢!
这刚刚开始在过去几天发生,我的代码没有改变.我犯了错误,还是这个新错误?
似乎这意味着我应该在firebase forge中添加我的安全规则以允许从我正在处理的域(在本例中为localhost)中进行访问,但我不知道在哪里可以找到该文档.
有人可以帮忙吗?我如何通过此错误?
angularjs ×4
dart ×3
flutter ×2
javascript ×2
dart-html ×1
firebase ×1
gcloud ×1
gcloud-ruby ×1
ruby ×1