小编mar*_*k12的帖子

Angular - Websocket和$ rootScope.apply()

我正在玩一个角度应用程序,它使用websocket与后端进行通信.我在使角度的数据绑定正常工作时遇到了一些麻烦.

在下面的示例中,我创建了一个创建websocket连接的服务.如果websocket收到消息,我只需将该消息推送到包含所有收到的消息的数组中.

在我的控制器中,我将该消息数组绑定到作用域,然后用于ng-repeat在部分视图中列出它们.

服务:

factory('MyService', [function() {

  var wsUrl = angular.element(document.querySelector('#ws-url')).val();
  var ws = new WebSocket(wsUrl);

  ws.onopen = function() {
    console.log("connection established ...");
  }
  ws.onmessage = function(event) {
      Service.messages.push(event.data);
  }   

  var Service = {};
  Service.messages = [];
  return Service;
}]);
Run Code Online (Sandbox Code Playgroud)

控制器:

controller('MyCtrl1', ['$scope', 'MyService', function($scope, MyService) {
  $scope.messages = MyService.messages;
}])
Run Code Online (Sandbox Code Playgroud)

部分:

<ul>
  <li ng-repeat="msg in messages">
      {{msg}} 
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

但是这不能正常工作.当收到新消息并将其推送到阵列中时,应显示所有消息的列表不会更新.我预计它会因为角度双向数据绑定而更新.

我找到了一个解决方案,它通过将消息的推送包装到服务中的调用中来$rootScope.apply()实现:

ws.onmessage = function(event) {
  $rootScope.$apply(function() {
    Service.messages.push(event.data);
  });
}  
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 这是角度的预期行为,如果我不使用,我的列表不会自动更新$rootScope.apply()吗?

  2. 为什么我甚至需要把它包起来 …

javascript websocket angularjs

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

等待多个事件

我目前正在开发一个主要用于自我教育目的的应用程序,因为我还没有完全习惯于js,我可以使用一些帮助解决我的问题:

在我的应用程序中,我使用的是一个javascript库(jqMobi),用于DOM操作,页面转换,ajax调用等,我还使用phonegap访问设备功能,如地理位置.

当我启动我的应用程序时,我想获取设备的地理位置,向我的服务器发送ajax(jsonp)请求(包括设备的地理位置),该请求返回一个json对象数组,我将用它来构建一个列表.

在我获得地理位置之前,我需要等待phonegap加载.在使用jqMobi进行ajax调用并处理响应之前,我需要等待它加载.

所以我基本上要听的事件

document.addEventListener("DOMContentLoaded",execute_this,false);  //jqMobi is now ready
document.addEventListener("deviceready", execure_sth, false); //Phonegap is now ready
Run Code Online (Sandbox Code Playgroud)

一旦这两个事件都被触发而不是之前,我该如何执行一个函数?

如果我使用jQuery,我会使用它的$ .Deferred对象及其When ... Then Function,但由于我无法访问这些,我正在寻找替代方案.

在此先感谢您的帮助!

javascript dom-events

8
推荐指数
3
解决办法
3517
查看次数

修改PHAR文件

我需要修改一个PHAR文件.每当我对文件进行更改然后执行它时,我都会收到以下错误消息:

Fatal error: Uncaught exception 'PharException' with message SHA1 signature could not be verified: broken signature'
Run Code Online (Sandbox Code Playgroud)

通过做一些研究,我发现我可以

  • 提取phar,修改它然后"将其放回phar文件".我怎么做?

  • 或者phar.require_hash = false在我的php.ini中设置以禁用签名检查.不幸的是,这并没有解决问题

我只需要对文件做一些简单的修改,我是唯一一个要使用它的人,所以我更希望快速简单地解决问题

php phar

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

Magento - 默认与主要送货地址

如果我按以下方式加载客户:

$customer = Mage::getModel('customer/customer')
    ->load($customer_id);
Run Code Online (Sandbox Code Playgroud)

是什么区别:

$customer -> getDefaultShippingAddress();
Run Code Online (Sandbox Code Playgroud)

$customer -> getPrimaryShippingAddress();
Run Code Online (Sandbox Code Playgroud)

提前致谢!

magento

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

抽象类 - 为什么我的受保护方法可公开访问?

为什么我可以在doStuff()下面的主要方法中访问方法?既然doStuff()受到保护,我希望只能TestClassImplementation访问它.

public abstract class AbstractTestClass {
    protected void doStuff()
    {
        System.out.println("doing stuff ...");
    }
}

public class TestClassImplementation extends AbstractTestClass{

}

public class MyProgram {
    public static void main(String[] args) {
        TestClassImplementation test = new TestClassImplementation();
        test.doStuff(); //why can I access the doStuff() Method here?
    }
}
Run Code Online (Sandbox Code Playgroud)

java

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

jQuery代码适用于Firefox,但不适用于Chrome

我有以下jQuery代码在Firefox和Internet Explorer中正常工作.它在Chrome中不起作用,我无法弄清楚原因.

我正在尝试background-image使用此代码更改元素:

$(".category-nav").find("a").each(function(index){
    if($(this).css("background-color") === "transparent" && !$(this).parent().hasClass("level1"))
    {
        $(this).css("background-image", "url(/images/gallery/images/arrow-cat-list-grey.png)");
    }
}); 
Run Code Online (Sandbox Code Playgroud)

jquery google-chrome

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

PHP preg_match与正则表达式工作

function validateDate( $date )
{ 
    echo $date;
    //2012-08-24 20:30:00
    if(preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/', $date) >= 1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

这总是返回false.我使用了一个唯一的工具来构建正则表达式,它在那里工作得很好.当我将"/"添加到正则表达式时,麻烦就开始了.不知何故PHP似乎需要这些,但我不知道为什么,我不知道为什么它打破了我的正则表达式.

它应该返回TRUE for sth.像"2012-08-24 20:30:00"和"asdf2012-08-24 20:30:00asdf"或任何不符合我的正则表达式的任何错误

提前致谢!

-----------------------编辑感谢您的所有答案!

正如一些用户指出我的函数在样本日期"2012-08-24 20:30:00"返回true.但是,只有当我手动设置$ date ='2012-08-24 20:30:00'时才会这样做.如果我使用完全相同的字符串在我的代码中的其他地方调用该函数,则返回false.有谁知道为什么?

----------------------- EDIT2

对不起浪费你的时间,实际上是一些空格被添加到字符串中.在调用我的函数之前在我的日期使用trim()会给出正确的结果.

感谢大家!

php preg-match

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