小编Dan*_*lho的帖子

将参数传递给事件侦听器/处理程序

如何通过事件监听器传递参数/变量?我使用匿名函数相当有效地克服了这个问题; 这是一个非常简单的解决方案,但在一天结束时,它闻起来像一个巨大的功能漏洞,我认为应该是本地提供的.

通常生活会继续,但是就像命运一样,现在我实际上需要删除监听器,当你使用匿名函数时这样做有点时髦.所以,再次,我试图找出如何将参数传递给事件侦听器,以便可以通过简单地引用该函数来删除事件侦听器.

奇怪,因为它看起来,我已经克服了这个问题,以及,但我不喜欢它,累了使用它的.在我看来,它是代码味道.但它就像一个魅力.我将变量,对象或其他内容存储在调度MovieClip上.因此,如果我循环访问数据数组,即时生成缩略图,我只需将数据变量(通常是具有多个属性的对象)存储在实际的缩略图MovieClip中.然后我可以通过引用访问事件监听器方法中的所有数据:

event.target.data
.在这个例子中,"data"是持有我想要的信息的变量的名称.因为当我不使用它时出现的另一个问题是,当我循环遍历数组并生成单击以查看大图像的缩略图时,索引不一致.在循环结束时,所有缩略图都将使用最后一个索引"i"打开图像.因此,如果我有一个长度为12的数组,无论你点击什么缩略图,它们都会加载第12个图像.将数据存储到MovieClip本身,创建一个永不改变的可靠引用.

这已经困扰了我一段时间了.基本上我想知道的是,这是一个好的做法,那里有更好的解决方案吗?

以下是一些饮食示例.如有必要,我可以发布更详细的例子.所有示例都描述了在单击时加载大图像的缩略图.




不使用匿名函数(问题):

tempThumb.addEventListener(MouseEvent.CLICK, loadImage);

public function loadImage(_event:MouseEvent):void  
{
    // I don't have the variable _url and preparing a hot bath with a cold blade  
}

使用匿名函数:

tempThumb.addEventListener(MouseEvent.CLICK, function(_event:MouseEvent) { loadImage("large.jpg"); } );

public function loadImage(_url:String):void  
{
    // I got the variable _url and packing away the razor blades  
}

没有使用匿名函数,但使用我的臭妖精技术将数据存储到MovieClip中调度事件

tempThumb.data = "large.jpg";

tempThumb.addEventListener(MouseEvent.CLICK, loadImage);

public function loadImage(_event:MouseEvent):void  
{
    trace(event.target.data);
    // I can access the variable  
}

我对编程术语并不了解,所以我将上面的妖精技术称为.在对象中存储/隐藏变量以供以后使用/访问.它解决了我所有的问题并且工作得非常好.但是,如果有更好的方法,我想知道 …

flash actionscript-3 addeventlistener

10
推荐指数
1
解决办法
1万
查看次数

当URI可以动态解析时,路由器有什么好处?

我正在尝试做出架构决策,我担心在设计基本REST API /框架时,我遗漏了一些关于URL路由/映射的重要信息.

创建通常在REST API框架中看到的路由类,这需要人们手动将URL映射到类,以及类方法(操作),这类似乎无法封装问题.当这一切都可以通过动态解析URL并拥有自动路由器或首页控制器来确定.

GET https://api.example.com/companies/

收集资源,获取所有公司的列表.

GET https://api.example.com/companies/1

通过ID获取单个公司.

所有似乎都遵循模板:https://api.example.com/<controller>/<parameter>/

好处1:URL解耦和抽象

我假设具有典型路由类的一个好处是,您可以从资源/物理类中分离或抽象URL.因此,如果您愿意,可以使用任意URL GET https://api.example.com/poo/来代替GET https://api.example.com/companies/所有公司.

但是在我看到的几乎所有示例和用例中,希望有一个匹配所需控制器,动作和参数的URL,1:1.

另一个可能的好处是,使用URL映射和典型路由器可以更容易地实现资源中的集合资源或嵌套资源.例如:

GET https://api.example.com/companies/1/users/

要么

GET https://api.example.com/companies/1/users/1/

可能是相当具有挑战性拿出一个模式,它可以动态地分析该知道为了得到数据,使用什么参数,并在使用它们所谓的控制器.但我想我已经拿出,可以使动态这项工作的标准方法.

而手动映射这将很容易.

我可以重新路由GET https://api.example.com/companies/1/users/到用户控制器,而不是公司的控制器,绕过它,只需设置参数"1"是该公司的ID为WHERE子句.

效益1.1:与物理路径无关

受益1,增编将是一个开发人员可以彻底改变URL方案和文件夹结构,在不影响API,因为一切都抽象映射.如果我选择移动文件,文件夹,类别,或重命名,它应该只是改变映射/路由的问题.

但仍然没有真正得到这个好处要么,因为即使你有你的整个API移动到另一个位置,在固定的.htaccess一个微不足道的变化这立即.

所以这:

GET https://api.example.com/companies/

GET https://api.example.com/v1/companies/

不会影响代码,即使是最轻微的.即使使用动态路由器.

好处2:控制暴露的功能

我想象一个典型的路由器类的另一个好处是,通过一个只解释和解析URL的动态路由器,可以控制你想要向API使用者公开的功能.如果你只是动态地做所有事情,你就会放弃你的裤子,自动让你的消费者访问整个系统.

我认为这是动态路由器的一个可能的好处,因为您不必手动定义并将所有路由映射到资源.它就在那里,自动完成.为了解决暴露问题,我可能会通过定义不允许API使用者使用的功能的黑名单来做相反的事情.我可能会更有效,定义黑名单,然后使用映射定义每个可用资源.再说一遍,我想它也风险更大.你甚至可以做白名单......这类似于典型的路由器,但你根本不需要任何扩展逻辑.在将URL传递给动态路由器之前,它只是系统将检查的URL列表.或者它可能只是动态路由器类的私有属性.

好处3:当HTTP方法不适合比尔时

我看到典型的路由器闪亮的一种情况是,您需要执行与现有资源冲突的操作.让我解释.

假设您要通过在用户类中运行登录功能来验证用户身份.但是现在,您无法POST https://api.example.com/users/使用凭据执行,因为这是为添加新用户而保留的.相反,您需要以某种方式在您的用户类中运行登录方法.你也不想使用它们POST https://api.example.com/users/login/,因为那时你使用的是除HTTP方法之外的动词.但是,对于典型的路由器,您可以直接映射它,如前所述.简单.

url => "https://api.example.com/tenant/"
Controller => "users"
Action => "login"
Params => "api_key, api_secret"

但是,我再一次看到了一个看似合理的选择.我可以创建另一个控制器,称为登录或租户,实例化我的用户控制器,并运行登录功能.所以消费者可以只凭POST https://api.example.com/tenant/凭证和责任.验证.

虽然,为了让这个替代工作,我将不得不物理创建另一个控制器,当使用URL映射器时,我不需要.但是,这种关注,功能和资源的分离也非常好.但是,也许这是主要的权衡,你宁愿只定义一个URL路由,还是必须为你遇到的每个细微差别创建新的类?

我没有看到或理解什么?我在这里错过了一个核心概念,只是无知吗?拥有典型的URL映射和路由类和功能有什么好处,我只是不知道,或者我几乎得到了这个?

api rest routing url-routing

5
推荐指数
1
解决办法
125
查看次数

简单的PHP函数布尔问题

有人请向我解释为什么这不起作用,以及我做错了什么.出于某种原因,当我运行该函数时validateUsername,$error变量保持完全不变,而不是评估为true.这怎么可能?

然而,如果我删除函数中的代码并在没有函数调用的情况下直接运行它,它就可以工作.下面的例子非常简单,实际上是伪代码,但它不起作用.这种行为对PHP来说是独特的吗?我不想再用其他语言来讨论这个问题.

<?php

$username = 'danielcarvalho';
$error = false;

function validateUsername()
{
    if (strlen($username) > 10)
    {
        $error = true;
    }
}

validateUsername();

if ($error == false)
{
    echo 'Success.';
}
else
{
    echo 'Failure.';
}

?>
Run Code Online (Sandbox Code Playgroud)

php boolean function

1
推荐指数
1
解决办法
5289
查看次数