小编Kne*_*ewB的帖子

$ http错误处理:区分用户脱机与其他错误

我有一个简单的联系表单,Angular通过AJAX提交到我在Google App Engine上的应用程序.(POST处理程序使用send_mail函数向网站所有者发送电子邮件).这是客户端代码:

$http.post('', jQuery.param(user), {
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    }
}).success(function(data, status, headers, config) {
    //...                        
}).error(function(data, status, headers, config) {
    alert('Please check your Internet connection and try again.');
});
Run Code Online (Sandbox Code Playgroud)

显然alert()是处理所有错误.假设我的服务器端代码没有错误,我猜测App Engine返回除HTTP状态代码200以外的任何其他内容的可能性很低.但是,我仍然希望区分服务器错误和丢失连接的用户.

我正在考虑textStatus按照这个SO答案使用XMLHttpRequest ,但它似乎不可用于$http.error()回调.我还想过使用Offline.js,但我不需要它做的大部分工作,所以在这种情况下看起来像浪费的字节.

$http.error() status我得到在脱机时为0,但我不知道这是如何跨浏览器的可靠性将是.我该怎么用?

ajax google-app-engine angularjs

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

赋值语句中的短路是否被认为是好的风格?

如果我理解正确的话

myvar = a and b or c
Run Code Online (Sandbox Code Playgroud)

给出了相同的结果

if a:
  if b:
    myvar = b
  else:
    myvar = c
else:
  myvar = c
Run Code Online (Sandbox Code Playgroud)

所以我觉得它更优雅.

我似乎记得在JavaScript代码中看到这种短路赋值语句.但是,在赋值语句中使用短路是否被认为是Python中的好风格?

python

5
推荐指数
2
解决办法
704
查看次数

find_elements_by_*函数是否始终反映DOM顺序?

是否browser.find_elements_by_css_selector('input[type=text]')总是WebElement按照反映DOM的顺序返回对象?

我问,因为我有一个待办事项列表的应用程序和表单元素出现在页面上的顺序(动态添加)是至关重要的,也许我是肛门但我正在测试这种行为作为我的测试套件的一部分.

注意:我可能会在各种浏览器中运行测试.

我的测试(Python with unittest):

def test_titles_should_appear_in_the_order_they_are_entered(self):
    titles = ['title 1', 'title 2', 'title 3']
    for title in titles:
        self._type_new_title(title).send_keys(Keys.RETURN)
    inputs = self.browser.find_elements_by_css_selector('input[type=text].title')
    # assumption: inputs will always reflect the DOM order, top to bottom
    input_vals = [i.get_attribute('value') for i in inputs]
    self.assertEqual(input_vals, titles)
Run Code Online (Sandbox Code Playgroud)

python selenium webdriver selenium-webdriver

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

为什么我的事件处理程序总是一个键击,$ timeout如何解决这个问题?

我完全困惑为什么我的按键事件处理程序始终是一个键击.http://plnkr.co/edit/w3FAXGd5zjrktO6DgOpD?p=preview

<body ng-controller="myController">
  <form>
    <input ng-keypress="handleKeypress($event)" />
  </form>
</body>
Run Code Online (Sandbox Code Playgroud)

控制器:

myapp.controller('myController', function($scope, $timeout){

    $scope.handleKeypress = function(ev){

      console.log(ev.target.value); //always one keystroke behind

      //$timeout(function(){console.log(ev.target.value);}); //works!

    };
}); 
Run Code Online (Sandbox Code Playgroud)

为什么需要$ timeout以及为什么/如何工作?(新手友好的答案更可取)

据我所知,使用keypress事件时,角色尚未插入到DOM中,但我很困惑,因为angularjs.org中的Hello World示例在释放键之前响应.他们的示例不使用自定义事件处理程序,但显然Angular在keyup事件之前更新了模型,所以我想了解更多关于在自定义事件处理程序中执行此操作的信息.

idursun的回答指出,event.which可用按键时,我还以为角可能会使用String.fromCharCode(),但我没有看到在角度源这种影响什么.

angularjs angularjs-directive

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

无法注入$ location服务

这段代码给了我Error: [$injector:unpr] Unknown provider: $scope, $locationProvider <- $scope, $location.

var app = angular.module('myApp.controllers', []);

app.controller('Signup', ['$scope, $location', function($scope, $location) {
    $scope.checkEmailValid = function(){
        //TODO make a decision about whether to go somewhere, if true do this:
        $location.path('/view2');
    };
}]);
Run Code Online (Sandbox Code Playgroud)

我错过了有关如何注入位置服务的内容吗?我没有配置$ locationProvider,但这样做似乎没有帮助.

angularjs angularjs-service

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

过滤已评估的QuerySet

我正在评估一个QuerySet,然后是另一个,但第二个是第一个的子集.我正在尝试以有效的方式执行此操作,尽可能少的数据库调用.(之前有人问过,但说实话,我并不完全理解答案,我不确定它们是否完全适用于我正在考虑的事情.)

使用Django doc的示例Weblog模型,在视图中,这是在尝试优化之前的代码:

myblog = Blog.objects.get(pk=1)

d={} #going to pass this to my template

# not using count()
d['num_of_entries'] = len(myblog.entry_set.all()) 

# not using exists()
d['is_jolly'] = bool(Entry.objects.filter(blog=myblog, headline__startswith='Jolly'))

# ... other code but no further use of database in this view
Run Code Online (Sandbox Code Playgroud)

第二个QuerySet是第一个QuerySet的子集.我应该尝试使用纯Python来获取子集(因此只评估一个QuerySet - 一个较少的数据库调用)?

或者,或许只是做以下事情?

# other code as above

d['num_of_entries'] = myblog.entry_set.count()

d['is_jolly'] = Entry.objects.filter(blog=myblog, headline__startswith='Jolly').exists()

# ... other code but no further use of database in this view
Run Code Online (Sandbox Code Playgroud)

django django-models

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

是否可以在按键之后但在键盘之前更新模型?

我正在使用jQuery开发一个类似todo的应用程序,但我想切换到Angular.

有一个用于添加新项目的输入字段,但只要在此输入中输入任何内容,键击 - 及其后面的那些 - 将有效地移动到现有项目组中的新项目.这意味着新项目输入文本框始终为空.更好地展示而不是解释:

http://jsfiddle.net/29Z3U/4/(删除了许多细节,但我所指的应用程序的方面已经过演示).

<h1>Song List</h1>
<form id="songs">
    <ul id="sortable_songs"></ul>
</form>

<ul id="new_song">
    <script id="song_form_template" type="text/x-handlebars-template">
        <li class="song" id="{{song_id}}">
            <input type="text" placeholder="enter song" autofocus />                        
        </li>
    </script>
</ul>
Run Code Online (Sandbox Code Playgroud)

一些jQuery:

var template = Handlebars.compile($('#song_form_template').html()),

    counter = (function(){var i=0; return function(){return ++i};})(),

    cloneNewSong = function(){
        var count = counter(),
            templateVals = {song_id: 'song_' + count};
        $('ul#new_song').append(template(templateVals));
    },

    addSong = function(event){
        //exclude certain keys here
        cloneNewSong();
        container = $(event.target).closest('li.song');
        container.appendTo('ul#sortable_songs');
        $(event.target)
            .removeAttr('placeholder')
            .focus(); //what I just typed disappears without …
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-ng-repeat

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