我有一个form指令,它使用callback带有隔离范围的指定属性:
scope: { callback: '&' }
Run Code Online (Sandbox Code Playgroud)
它位于一个内部,ng-repeat因此我传入的表达式包括id对象作为回调函数的参数:
<directive ng-repeat = "item in stuff" callback = "callback(item.id)"/>
Run Code Online (Sandbox Code Playgroud)
当我完成指令后,它会$scope.callback()从其控制器函数调用.对于大多数情况来说这很好,这就是我想要做的,但有时候我想从内部添加另一个参数directive.
是否有一个允许这样的角度表达式:$scope.callback(arg2)导致callback被调用arguments = [item.id, arg2]?
如果没有,最好的方法是什么?
我发现这有效:
<directive
ng-repeat = "item in stuff"
callback = "callback"
callback-arg="item.id"/>
Run Code Online (Sandbox Code Playgroud)
同
scope { callback: '=', callbackArg: '=' }
Run Code Online (Sandbox Code Playgroud)
和指令调用
$scope.callback.apply(null, [$scope.callbackArg].concat([arg2, arg3]) );
Run Code Online (Sandbox Code Playgroud)
但我不认为它特别整洁,它涉及在隔离范围内放置额外的东西.
有没有更好的办法?
这里的Plunker游乐场(打开控制台).
我有一个可见性被切换的元素ng-show.我也在使用CSS动画 - 来自ng-animate的自动动画 - 在这个元素上为它的入口设置动画.
元素将包含图像或视频.
在元素包含视频的情况下,我想播放它,但我不想播放视频,直到完成动画制作.
因此,我想知道是否有一种简单的方法将回调绑定到AngularJS中CSS动画的结尾?
该文档引用doneCallback,但我看不到的方式来指定它...
一种解决方法(?)我想到的是$watch荷兰国际集团element.hasClass("ng-hide-add-active"),并等待它用火(true, false),这意味着它只是被删除..
有更好的方法吗?
将JSON数据从我的客户端发送到运行express的节点服务器时,我遇到了问题.
这是一个简单的服务器,演示了我的问题:
var express = require('express');
var app = express();
app.configure(function(){
app.use(express.bodyParser());
app.use(app.router);
app.use(express.logger());
});
app.listen(80);
app.post('/', function(req,res){
console.log(req.body);
console.log(req.body.number + 1);
});
Run Code Online (Sandbox Code Playgroud)
此服务器只是将所有POST数据记录到控制台.
如果我然后将以下内容粘贴到chrome的开发控制台中:
$.post('/', {number:1});
服务器打印出来:
{ number: '1' }
11
Run Code Online (Sandbox Code Playgroud)
如何阻止我传递的数字被解释为字符串?这与我正在使用的bodyParser中间件有关吗?
任何帮助赞赏!!
我想知道是否有人找到了我正在经历的行为的解决方法.
以下面的代码为例:
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '[----removed-------]', // App ID
channelUrl : 'http://localhost/channel.html', // Channel File
status : true, // check login status
cookie : true, // enable cookies
xfbml : true // parse XFBML
});
// Additional initialization code here
FB.Event.subscribe('auth.statusChange',fbLoginStatus);
console.log("getloginstatus");
FB.getLoginStatus(fbLoginStatus);
</script>
Run Code Online (Sandbox Code Playgroud)
使用状态设置为true的FB.init,实质上是getLoginStatus()根据facebook文档调用.但是,它显然是预期的行为,这将不会触发事件auth.statusChange,因为默认值是"未知",并且 "在没有登录"的值也是"未知"(即使它可以知道!!)
因此,如果我还想回复未登录Facebook的用户,我必须FB.getLoginStatus()明确地调用以及将状态设置为true.
问题是,如果用户不是"已注销",则会导致函数被调用两次.
有没有一种巧妙的方法来阻止这种情况发生?我认为我唯一的选择可能是调用一个不同的函数来处理身份验证更改事件.
我正在使用Mongoose和Node.js作为我的网络服务器.
作为我的一个文档模式的一部分,我有一个'timestamp'字段.架构中的行是:
timestamp: { type: Date, default: Date.now }
这工作正常,并允许我根据时间戳检索文档,但是,这保存为ISODate格式,如下所述:http://docs.mongodb.org/manual/core/document/#date ,如下所示:
"timestamp":"2013-04-04T19:31:38.514Z"
我不介意,但我把它发送给客户端.这意味着我必须在客户端使用Date.parse()才能进行比较操作.
有没有办法将日期存储为整数,或者在检索时自动将其转换为1?
有什么理由我应该保留它是如何,并在客户端处理它?
提前致谢.
我有一个带有WebView的应用程序,它可以下载视频并在VideoView中播放它们.
为了管理下载,我使用了android的方便的DownloadManagerAPI.不幸的是,在某些情况下我需要使用代理.
我已经成功设置了使用反射的WebView代理,详见本stackoverflow问题,但我不知道如何设置DownloadManager使用代理也是如此.
这可能吗?如果没有,我的替代方案是什么?
谢谢
我正在尝试使用量角器测试我网站上的登录页面.
如果您登录不正确,该网站会显示一条"吐司"消息,该消息会弹出5秒钟,然后消失(使用$timeout).
我正在使用以下测试:
describe('[login]', ()->
it('should show a toast with an error if the password is wrong', ()->
username = element(select.model("user.username"))
password = element(select.model("user.password"))
loginButton = $('button[type=\'submit\']')
toast = $('.toaster')
# Verify that the toast isn't visible yet
expect(toast.isDisplayed()).toBe(false)
username.sendKeys("admin")
password.sendKeys("wrongpassword")
loginButton.click().then(()->
# Verify that toast appears and contains an error
toastMessage = $('.toast-message')
expect(toast.isDisplayed()).toBe(true)
expect(toastMessage.getText()).toBe("Invalid password")
)
)
)
Run Code Online (Sandbox Code Playgroud)
相关标记(玉)如下:
.toaster(ng-show="messages.length")
.toast-message(ng-repeat="message in messages") {{message.body}}
Run Code Online (Sandbox Code Playgroud)
问题是toastMessage测试失败(找不到元素).它似乎在等待吐司消失然后运行测试.
我也尝试将toastMessage测试放在then()回调之外(我认为这无论如何都是多余的),但我得到完全相同的行为.
我最好的猜测是,量角器看到有一个$timeout …
我创建了一个接受回调作为属性的指令,例如:
<my-directive callback-expression="someFunction()"> </my-directive>
Run Code Online (Sandbox Code Playgroud)
该指令是可重用的,因此我给它一个隔离范围.我想根据是否callback-expression设置该属性在指令中显示一个按钮.
App.directive('myDirective', function(){
restrict: 'E',
scope: {
callbackExpression: '&'
},
template: '<button ng-show="!!callbackExpression">Fire callback</button>'
});
Run Code Online (Sandbox Code Playgroud)
问题是,即使表达式为空,它也是一个函数:
console.log($scope.callbackExpression) 使用空白属性会导致:
function (locals) {
return parentGet(parentScope, locals);
}
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案是将此行放在链接功能的顶部:
if (attributes.callbackExpression) scope.callbackButton = true
Run Code Online (Sandbox Code Playgroud)
然后ng-show在callbackButton
有没有其他选择不需要额外的线和范围属性?
我正在构建一个具有一种"播放列表"的应用程序.这表示一个ng-repeated自定义指令ng-repeat = "element in playlist"
因为我想允许用户在播放列表中重复使用相同的元素两次,所以我尝试使用track by $index添加.
现在,令人困惑的是:当我从播放列表中删除一个元素时(我有一个removeElement(index)基本上包含这样的东西的函数:
$scope.removeElement = function(index){
$scope.playlist.splice(index, 1);
}
Run Code Online (Sandbox Code Playgroud)
发生了一些奇怪的事情:元素被正确删除$scope.playlist,但由于某种原因,视图没有正确更新.最后一个元素似乎被删除了.
此外,我无法正确地重新排序数组中的元素.
当我删除track by $index这个问题消失,所以我认为这是因为当你从数组中删除一个项目时,如果你只是查看索引,那么看起来你刚刚删除了最后一个.
但是行为很奇怪,因为已经正确删除了被盗的内容 - 请参阅此plunker
编辑:上面的链接已被修改,以更好地显示问题,并显示我确定的答案.
这个问题也经过了轻微编辑,以便更清楚地了解我的情况.KayakDave下面的答案仍然是正确的,但更适合一系列原语(我原来的plunker特色).
TL; DR:如何在ng-repeat不牺牲控制位置或正确删除元素的能力的情况下将重复元素放入其中?
我正在使用 alpha 版本的 react 支持钩子,并希望验证我在一段时间后更新组件中文本的方法,而不会在 prop 更改时渲染组件超过所需次数。
编辑:为了清楚起见 - 此组件
moment(timepoint).fromNow()在formatTimeString函数内调用(此处为文档),因此更新并非完全没有必要,我保证!
我以前有:
const FromNowString = ({ timePoint, ...rest }) => {
const [text, setText] = useState(formatTimeString(timePoint));
useEffect(() => {
setText(formatTimeString(timePoint));
let updateInterval = setInterval(
() => setText(formatTimeString(timePoint)),
30000
);
return () => {
clearInterval(updateInterval);
};
}, [timePoint]);
// Note the console log here is so we can see when renders occur
return (
<StyledText tagName="span" {...rest}>
{console.log('render') || text}
</StyledText>
);
}; …Run Code Online (Sandbox Code Playgroud) 我试图写一些端到端的为我们的应用程序的登录流程测试,但我有麻烦我的脑袋周围设置当用户需要更改其密码的情况下的最佳途径.
当我们的服务器响应成功登录时,将返回带有changePassword字段的用户对象.然后,客户端检查响应并相应地重定向.
我的问题是设置测试以便设置changePassword字段 - 使用的最佳方法是什么?
我认为我的选择是:
为服务器设置测试设置和拆卸脚本,专门为测试运行创建一个全新用户,并changePassword在数据库中设置标志.
这似乎是最端对端的方法,但也可能是最省力的代码.
以某种方式拦截测试中的http响应并修改changePassword仅为此测试设置的标志.
完全模拟http响应.使用这种方法是从端到端测试中删除最多的,但也许是最简单的?
哪种方法最好或最常用?关于如何用量角器实际实现上述(特别是1和2)的任何一般指示都会很棒 - 我发现在概念上难以直接进入我的脑海,因此很难知道要搜索什么.
我用量角器作为测试框架,angular.js客户端供电,并且节点服务器上运行使用(除其他事项外)express.js和MongoDB的.
我正在尝试将内容垂直居中在列布局中的两个弹性框中.
我已经创建了一个简化的小提琴来演示.
HTML:
<div id='container'>
<div id= "top">
some content!
</div>
<div id= "bottom">
some content!
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
CSS:
#container{
display: -webkit-flex;
width:100%;
height:300px;
-webkit-flex-direction: column;
-webkit-justify-content: space-around;
background-color: gray;
}
#container div{
text-align:center;
background-color:red;
//-webkit-flex: 1; //uncomment to see 2nd option
//vertical-align: middle; //doesn't work
}
Run Code Online (Sandbox Code Playgroud)
我希望内部DIV垂直拉伸以填充剩余空间.我可以通过取消注释flex值来做到这一点,但是当我这样做时,内容与顶部对齐.我尝试了纵向对齐,但这不起作用(我没想到它!)......
因为我的应用程序有一个动态高度的容器,我不能使用固定的边距或填充来排序这个问题.
有没有办法做到这一点?也许我必须让内部div本身是flex容器,但这看起来有点乱.