我将所有AngularJS控制器都放在一个文件controllers.js中.该文件的结构如下:
angular.module('myApp.controllers', [])
.controller('Ctrl1', ['$scope', '$http', function($scope, $http) {
}])
.controller('Ctrl2', ['$scope', '$http', function($scope, $http) }
}])
Run Code Online (Sandbox Code Playgroud)
我想做的是将Ctrl1和Ctrl2放入单独的文件中.然后我会在index.html中包含这两个文件,但是应该如何构建呢?我尝试做这样的事情,它在Web浏览器控制台中抛出一个错误,说它无法找到我的控制器.任何提示?
我搜索了StackOverflow并发现了类似的问题 - 但是,这种语法在Angular之上使用了不同的框架(CoffeeScript),因此我无法遵循.
我正在寻求有关设计此最佳方式的建议-
用例
我想将多个文件放入 S3。成功保存所有文件后,我想触发一个 lambda 函数来做一些其他工作。
天真的方法
我解决这个问题的方法是在 Dynamo 中保存一条记录,其中包含一个唯一标识符和我将上传的记录总数以及应该存在于 S3 中的密钥。
一个基本的实现是采用我现有的 lambda 函数,该函数在我的 S3 存储桶写入时调用,并让它手动检查是否所有其他文件都已保存。
Lambda 函数会知道(查看 Dynamo 以确定我们要查找的内容)并查询 S3 以查看其他文件是否在其中。如果是,请使用 SNS 触发我的另一个 lambda 来执行其他工作。
编辑:另一种方法是让我将文件放在 S3 中的客户端程序负责直接调用另一个 lambda 函数,因为从技术上讲,它知道所有文件何时上传。这种方法的问题是我不希望这是客户端程序的责任......我希望客户端程序不在乎。一旦它上传了文件,它应该能够退出。
想法
我不认为这是一个好主意。主要是因为 Lambda 函数应该是轻量级的,并且从 Lambda 函数内轮询数据库以获取所有上传文件的 S3 密钥,然后检查 S3 是否存在 - 每次都这样做似乎是贫民窟并且非常重复。
什么是更好的方法?我正在考虑使用 SWF 之类的东西,但不确定这对我的解决方案来说是否太过分了,或者它是否能让我做我想做的事。该文档也没有显示真正的“示例”。这只是一个讨论,没有太多的分步指南(也许我找错了地方)。
编辑回应以下 mbaird 的建议-
选项 1 (SNS)这就是我会去的。这很简单,并没有真正违反单一职责原则。也就是说,客户端上传文件并发送通知(通过 SNS)表明其工作已完成。
选项 2(Dynamo 流)因此,这本质上是选项 1 的另一个“实现”。客户端进行服务调用,在这种情况下,这会导致表更新与 SNS 通知(选项 1)。此更新将触发 Lambda 函数,而不是通知。不错的解决方案,但我更喜欢使用 SNS 进行通信,而不是依赖数据库的功能(在本例中为 Dynamo 流)来调用 Lambda 函数。
在任何情况下,我都在使用 AWS 技术并与他们的产品(Lambda 函数、SNS 等)耦合,但我觉得依赖于 Dynamo 流之类的东西使其耦合更加紧密。对我的用例来说并不是一个很大的问题,但仍然感觉很脏;D …
我试图搜索关于这个主题的任何讨论,但到目前为止我还没有找到任何有用的东西.因此,我决定继续发布这个.
所以我的查询是关于Android最佳做法.我正在创建一个调用RESTful端点的简单应用程序,解析下载的JSON,并在活动中包含的某些片段中显示结果.
我有一个自定义的"实用程序"类,它扩展了AsyncTask.在doInBackground方法中,我发出请求,将响应存储在String中等等(非常简单的东西).
现在,我了解AsyncTask还有另外两个方法 - onPreExecute和onPostExecute.如果我在网上研究的是正确的,这些方法是我应该能够与UI交互的地方,通过将我的上下文传递给这个实用程序类,通过id查找视图,设置字段文本,或者我想要的任何内容去做.
所以这是我的问题.围绕这个的最佳做法是什么?
目前,扩展AsyncTask并使Web服务调用的实用程序类具有私有成员变量:
private FragmentActivity mActivityContext;
Run Code Online (Sandbox Code Playgroud)
然后,为了与UI进行交互,我做了类似这样的事情:
@Override
protected void onPreExecute()
{
super.onPreExecute();
android.support.v4.app.FragmentManager fm = mActivityContext.getSupportFragmentManager();
MainActivity.PlaceholderFragment fragment = (MainActivity.PlaceholderFragment)fm.findFragmentByTag("PlaceholderFragment");
if (fragment != null)
{
TextView textView = (TextView)fragment.getView().findViewById(R.id.my_custom_field);
textView.setText("This field was updated through onPreExecute!");
}
}
Run Code Online (Sandbox Code Playgroud)
虽然到目前为止这似乎工作正常,但我担心的是 - 如果实用程序类访问它引用的活动的片段管理器?它甚至应该参考活动吗?通过使用片段管理器,实用程序类必须知道片段标记.这不是一种非常模块化或松散耦合的方法.当我创建实用程序类的实例时,解决方案就像传递fragment标记一样简单而不是像我现在那样硬设置吗?还是有更好的替代路线?
活动A启动活动B.在活动B中,我有这个方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
// This ID represents the Home or Up button. In the case of this
// activity, the Up button is shown. Use NavUtils to allow users
// to navigate up one level in the application structure. For
// more details, see the Navigation pattern on Android Design:
//
// http://developer.android.com/design/patterns/navigation.html#up-vs-back
//
NavUtils.navigateUpTo(this, new Intent(this,
ArticleListActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)
当我按下那个主页按钮时,它会将我带到活动A.但是,onCreate再次被调用.我不想要这种行为.
我猜它是因为这个实现使用新的Intent到导航堆栈中的前一项.这只是我在创建双窗格项目时从Eclipse获得的代码.我查看了堆栈溢出,虽然似乎使用Intent返回导致此行为,但我不明白为什么Google会在默认模板中提供此功能.
我应该如何以不同的方式进行此调用,以便在返回活动A时不再调用onCreate?
我需要进行如下服务调用: http://myservice.com/path ?var1=value1&var2=value2
我遇到的问题是 value1 和 value2 最终被编码,这使得服务调用失败。例如,value1 类似于“a=b&b=c;2&&=”...它基本上包含特殊字符。
我猜测这是服务需要解决的问题 - 正确处理解码编码字符,我认为它目前没有这样做。
以下是我如何提出这些请求的示例:
WebTarget target = client.target("http://test.com")
.path("path1")
.queryParam("var1", var1);
Builder builder = target.request();
...
Run Code Online (Sandbox Code Playgroud)
让我困惑的是,如果我仅使用 Chrome 发出相同的请求,一切都会正常。所以这让我相信我应该通过 Jersey API 来“禁用”编码。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
self.mapView.frame = self.view.bounds;
self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
CLLocationCoordinate2D startCoord = CLLocationCoordinate2DMake(36.7472, -95.9594);
MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:MKCoordinateRegionMakeWithDistance(startCoord, 10000*1609.344, 10000*1609.344)];
[self.mapView setRegion:adjustedRegion animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
这就是我现在的代码.当我将iPad的方向从横向更改为纵向时,地图视图的大小不会更改.我希望它能填满整个视图.我试过搜索谷歌和stackoverflow的解决方案,但我没有运气.
任何帮助都会非常感激.
以下是我尝试这样做的方法:
# Start Google Chrome
subprocess.call(["C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", "--kiosk"])
Run Code Online (Sandbox Code Playgroud)
如果我将--kiosk标记添加到桌面上的Google Chrome快捷方式,则Chrome会以自助服务终端模式启动.但是,当我通过Python尝试这个时,它似乎不起作用.我在Google和这里搜索过,但到目前为止还没有找到任何内容.请帮忙.
所有,
这是一条简单的路线:
<route>
<from uri="jetty://http://0.0.0.0:9090/myproject" />
<setExchangePattern pattern="InOnly" />
<process ref="JsonValidator"/>
<unmarshal>
<json library="Jackson" unmarshalTypeName="com.myproject.JsonPojo"/>
</unmarshal>
...
</route>
Run Code Online (Sandbox Code Playgroud)
JsonValidator是一个简单的Java bean,我扩展了处理器.在这里,我想确保在继续使用Jackson将JSON解组到我的POJO之前的unmarshal调用之前传递所有必需的字段.
我现在所做的只是一行:
public void process(Exchange exchange) throws Exception {
String input = exchange.getIn().getBody(String.class);
}
Run Code Online (Sandbox Code Playgroud)
简单地调用exchange.getIn().getBody(String.class)导致我的路径中的下一个(解组)步骤抛出错误,说没有任何解组.事实上,我通过在JsonValidator之后添加另一个处理器来测试这个 - 在那里,交换体不是null但是它是空的.
这是错误:
com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: org.apache.camel.converter.stream.InputStreamCache@78f0a00a; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:2931)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2873)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2080)
at org.apache.camel.component.jackson.JacksonDataFormat.unmarshal(JacksonDataFormat.java:105)
at org.apache.camel.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:65)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
at org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:151)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) …Run Code Online (Sandbox Code Playgroud) 我有这样的数据:
List<Map<String, String>> = // psuedocode
[
{
"ID": "a",
"Value": "val1"
},
{
"ID": "b",
"Value": "val2"
},
]
Run Code Online (Sandbox Code Playgroud)
我想把它变成
Map<String, String> = // more pseudocode
{
"a": "val1",
"b": "val2"
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我有这样的事情:
Map<String, String> output = myList.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap())
Run Code Online (Sandbox Code Playgroud)
有人可以指导我吗?另一种方法是使用常规for循环,但我正在尝试使用lambdas.
java ×3
android ×2
amazon-s3 ×1
amazon-swf ×1
angularjs ×1
apache-camel ×1
aws-lambda ×1
controller ×1
ios ×1
jackson ×1
java-8 ×1
javascript ×1
jersey-2.0 ×1
json ×1
lambda ×1
mapkit ×1
mkmapview ×1
orientation ×1
python ×1
resize ×1
subprocess ×1