2013-08-30 26 views
0

只要我閱讀docs for underscore.js' _.result,我認爲它在表單驗證的上下文中可能很有用。所以在我的骨幹視圖我有一個保存方法如下:_.result的用例示例

save : function() { 
    var values = _.reduce(this.$el.find(":input"), function(values, input) { 
     values[input.name] = input.value; 
     return values; 
    }, {}); 

    this.showErrors(_.result(this.validate(values), 'unlessValid')); 

    /* 
    NOTE: I've concluded this is a more idiomatic underscore.js approach 

    _.compose(submitForm, _.wrap(unlessFormInvalid, showFormErrors)); 

    However I've left out 'this.' to reduce the 'noise', and yet the calls 
    to '_.compose' and '_.wrap' make this noisier than I'd like anyway, and 
    would undoubtedly be exacerbated in cases where there are more than just 
    'unless' and (implicit above) 'if' conditions. Therefore I'm becoming more 
    inclined to implement my own sort of promise/'thennable' interface, such as: 

    this.validateForm().then({ 
     onValid: this.submitForm, 
     onInvalid: this.showFormErrors 
    }); 
    */ 
} 

我覺得好像最後一行很好地描述過程。然而,我的實現似乎有點矯枉過正,因爲我總是隻返回一個帶有一個屬性的對象:'unlessValid'。以下是其他方法的完整「管道」,它們按預期工作。然而,我很好奇其他可能更好的用例underscore.js的_.result功能。

submissionErrors : function(values) { 
    console.log('inside submissionErrors -- always get here'); 
    console.log('but only reach showErrors if submissionErrors returns value'); 
    // return {}; 
}, 

validate : function(values) { 
    var unlessValid = this.submissionErrors(values) || this.persist.call(this, values); 

    return { 
     unlessValid: unlessValid 
    } 
}, 

persist : function(values) { 
    console.log('inside persist'); 
}, 

showErrors : function(errors) { 
    if (errors) { 
     console.log('inside show Errors'); 
    } 
} 
+0

骨幹本身使用'.result'。 –

+0

無論誰投票結束這個(並且下調了它),因爲這被認爲主要是基於意見的,你會錯的。我要求提供其他用例的例子,「可能更好」,但任何例子。 –

+0

我不認爲你的代碼受益於'_.result';它會表現相同,如果你只是'this.showErrors(this.validate(values));'和'validate'只是返回'this.submissionErrors(values)|| this.persist.call(this,values);'。你似乎永遠不會在'unlessValid'中返回一個函數... – bfavaretto

回答

6

_.result有一個非常簡單的目的(與大多數下劃線函數一樣)。它可以讓你從一個對象獲得一個命名值,而不需要知道或關心該值是作爲屬性還是方法存儲的。因此:

var nameProperty = {name: 'Peter'}; 
var nameMethod = {name: function() {return 'Peter';}}; 
console.log(_.result(nameProperty, 'name')); 
console.log(_.result(nameMethod, 'name')) 

在這兩種情況下,該代碼將工作,成功登錄名,而不是拋出一個TypeError

這就是它的全部。這非常簡單明瞭。

現實世界的例子是Backbone.Model.url

+0

感謝您的好解釋。爲什麼我認爲它在表單驗證方面可能很好,通常你要麼對錶單驗證的結果做一些事情,如果出現錯誤,或者你想執行一個函數。只是試圖推動我的下劃線知識,但在我的情況下,可能只是傳遞一個回調會更乾淨。 –

+0

@GeorgeJempty這實際上可能是一個用例。在現代JavaScript中,通常[getters和setter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Defining_getters_and_setters)爲此目的服務,像'_.result'之類的東西不再需要。 –

+0

下劃線文檔很簡潔,我認爲還有更多。謝謝你的解釋。 – ericso