我发现Angular对模型的使用令人困惑.Angular似乎采用了一种模型可以是你喜欢的方法 - IE Angular不包含显式模型类,你可以使用vanilla JavaScript对象作为模型.
在我见过的几乎所有Angular示例中,模型实际上都是一个对象,可以手工创建,也可以通过资源从API调用返回.因为我所看到的几乎每个Angular示例都很简单,通常存储在控制器中$ scope上的模型数据以及与模型相关的任何状态(例如选择)也存储在控制器中的$ scope中.这适用于简单的应用程序/示例,但是当应用程序变得更加复杂时,这似乎过于简单了.例如,存储在控制器中的模型状态存在变为上下文的风险并且如果上下文改变则丢失.控制器存储selectedGallery并且selectedPhoto只能存储全局selectedImage,而不是selectedPhoto每个库.在这种情况下,每个图库使用一个控制器可能会否定这个问题,但从UI的角度来看,这似乎是浪费的,可能是不恰当和不必要的.
Angular对模型的定义似乎更接近我所认为的VO/DTO,它是服务器和客户端之间传递的愚蠢对象.我的直觉是将这样的对象包装在我认为的模型中 - 一个维护与DTO/VO相关的状态的类(例如选择),根据需要提供操纵DTO/VO的变换器,并通知其余的应用对基础数据的更改.很明显,最后一部分很好地由Angular的绑定处理,但我仍然看到前两个职责的强大用例.
但是我没有真正看到我看过的例子中使用的这种模式,但我也没有看到我认为可扩展的替代方案.Angular似乎暗中不鼓励使用服务作为模型,通过强制执行Singletons(我知道有办法解决这个问题,但它们似乎没有得到广泛使用或批准).
那么我应该如何保持模型数据的状态呢?
[编辑] 这个问题的第二个答案很有趣,接近我目前正在使用的内容.
我今天正试图用ui-router来试图更好地理解Ionic中的脚手架,我注意到的一件事是他们给了抽象状态的"标签"一个网址.
我曾经使用抽象状态的唯一一次,我使用空字符串作为url,我注意到如果我偶然尝试导航到抽象状态(而不是子状态),我会得到错误:
无法过渡到抽象状态'[insertAbstractStateHere]'
编辑:
"而且,在实验中,当我尝试将一个网址分配给我的抽象状态(离开Ionic)并仍然呈现嵌套状态视图时,我得到一个大鹅蛋.根本没有任何东西出现."
上面引用的陈述是假的!我在Plunker再试一次,嵌套状态确实出现了.
angular.module('routingExperiments', ['ui.router'])
.config(function($urlRouterProvider, $stateProvider) {
$stateProvider
.state('abstractExperiment', {
abstract: true,
url: '', //<--- seems as if any string can go here.
templateUrl: 'abstractExperiment.html'
})
.state('abstractExperiment.test1', {
url: '/test1',
templateUrl: 'abstractTest1.html'
});
});
Run Code Online (Sandbox Code Playgroud)
显然我确实做错了.所以我的新问题是:
在采用抽象状态时,有没有理由使用命名状态而不是空字符串,或者它只是一种风格选择?
我的应用使用Firebase API进行用户身份验证,将登录状态保存为Vuex状态中的布尔值.
当用户登录时,我设置登录状态并相应地有条件地显示登录/登出按钮.
但是当刷新页面时,vue应用程序的状态将丢失并重置为默认值
这会导致问题,即使用户登录并刷新页面时,登录状态也会设置为false,并且即使用户保持登录状态,也会显示登录按钮而不是注销按钮....
我该怎么做才能防止这种行为
我可以使用cookies 或任何其他更好的解决方案可用...
让我困惑的一件事是,是否可以使用IORef.在决定是否使用IORef执行任务时是否应遵循任何指导原则?什么时候是使用州立大学的好时机而不是IORef?
我想以编程方式更新按钮的选择器.
我可以使用下面给出的xml文件来完成此操作
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:drawable="@drawable/btn_off" />
<item android:state_pressed="true"
android:state_enabled="true"
android:drawable="@drawable/btn_off" />
<item android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/btn_on" />
<item android:state_enabled="true"
android:drawable="@drawable/btn_on" />
</selector>
Run Code Online (Sandbox Code Playgroud)
我想以编程方式做同样的事情.我试过下面给出的东西
private StateListDrawable setImageButtonState(int index)
{
StateListDrawable states = new StateListDrawable();
states.addState(new int[] {android.R.attr.stateNotNeeded},R.drawable.btn_off);
states.addState(new int[] {android.R.attr.state_pressed, android.R.attr.state_enabled},R.drawable.btn_off);
states.addState(new int[] {android.R.attr.state_focused, android.R.attr.state_enabled},R.drawable.btn_on);
states.addState(new int[] {android.R.attr.state_enabled},R.drawable.btn_on);
return states;
}
Run Code Online (Sandbox Code Playgroud)
但它没有用.
以及如何设置android:state_enabled="false"或android:state_enabled="true"编程.
出于内省的目的,有时我想自动为类型或类似的东西分配序列号.
不幸的是,模板元编程本质上是一种功能语言,因此缺乏实现这种计数器的全局变量或可修改状态.
或者是吗?
按请求的示例代码:
#include <iostream>
int const a = counter_read;
counter_inc;
counter_inc;
counter_inc;
counter_inc;
counter_inc;
int const b = counter_read;
int main() {
std::cout << a << ' ' << b << '\n'; // print "0 5"
counter_inc_t();
counter_inc_t();
counter_inc_t();
std::cout << counter_read << '\n'; // print "8"
struct {
counter_inc_t d1;
char x[ counter_read ];
counter_inc_t d2;
char y[ counter_read ];
} ls;
std::cout << sizeof ls.x << ' ' << sizeof ls.y << '\n'; // print "9 …Run Code Online (Sandbox Code Playgroud) 这似乎是重复的,因为那里有相同的问题.
不幸的是,所有这些问题的所有答案都缺少一个细节:各州.
我在哪里可以获得国家,州和城市的列表?
例如,我想要这个:
| Sydney | New South Wales | Australia |
Run Code Online (Sandbox Code Playgroud)
要么
| Miami | Florida | United States |
Run Code Online (Sandbox Code Playgroud)
我不想要这样的东西,它排除了国家:
| Miami | United States |
Run Code Online (Sandbox Code Playgroud)
有什么地方可以获得这种数据吗?
我已经尝试过以下数据源:
但所有这些都排除了各州.
假设您正在Haskell中构建一个相当大的模拟.有许多不同类型的实体,其属性随着模拟的进行而更新.让我们说,为了举例,您的实体被称为猴子,大象,熊等.
维护这些实体状态的首选方法是什么?
我想到的第一个也是最明显的方法是:
mainLoop :: [Monkey] -> [Elephant] -> [Bear] -> String
mainLoop monkeys elephants bears =
let monkeys' = updateMonkeys monkeys
elephants' = updateElephants elephants
bears' = updateBears bears
in
if shouldExit monkeys elephants bears then "Done" else
mainLoop monkeys' elephants' bears'
Run Code Online (Sandbox Code Playgroud)
在mainLoop函数签名中明确提到的每种类型的实体已经很难看了.你可以想象,如果你有20种类型的实体,它会变得非常糟糕.(20对于复杂的模拟来说并非不合理.)所以我认为这是一种不可接受的方法.但它的优点在于它们的功能updateMonkeys非常明确:它们会获取Monkeys列表并返回一个新的.
那么接下来的想法是将所有内容都卷成一个包含所有状态的大数据结构,从而清理以下签名mainLoop:
mainLoop :: GameState -> String
mainLoop gs0 =
let gs1 = updateMonkeys gs0
gs2 = updateElephants gs1
gs3 = updateBears gs2
in
if shouldExit gs0 then "Done" else
mainLoop …Run Code Online (Sandbox Code Playgroud) 我试图在我的flask应用程序中保存缓存字典.
据我所知,应该使用Application Context,特别是flask.g对象.
建立:
import flask as f
app = f.Flask(__name__)
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
with app.app_context():
f.g.foo = "bar"
print f.g.foo
Run Code Online (Sandbox Code Playgroud)
它打印bar.
继续以下内容:
with app.app_context():
print f.g.foo
AttributeError: '_AppCtxGlobals' object has no attribute 'foo'
Run Code Online (Sandbox Code Playgroud)
我不明白,文档根本没有帮助.如果我正确阅读它们,应该保留状态.
我的另一个想法是简单地使用模块范围的变量:
cache = {}
def some_function():
cache['foo'] = "bar"
Run Code Online (Sandbox Code Playgroud)
但似乎每次请求都会重置这些内容.
怎么做到这一点?
编辑: Flask 10.1
我已经阅读了十几次,因为状态对象可能存在多个键值对,并且它与新的历史条目相关联.但有人可以给我一个状态对象的好处的例子吗?它的实际用途是什么?我无法想象为什么不只是输入{}