2013-10-14 38 views
0

我可能會炫耀我對這個技能的缺乏。但由於I'm所有學習I'm願意讓驕傲去...在javascript中敲出數組作爲全局變量

在我的ViewModel我定義:

self.Tags() = ko.observableArray(); 
self.Skills() = ko.observableArray(); 

然後我要救我的標籤。我創建視圖模型之外的這個功能,我做一些處理:

function saveTags(category, mytagsArray) { ... } 

我稱之爲「saveTags(‘技能’,技能)」從視圖模型中,並得到這個錯誤告訴我self.Tags()不一個函數。

爲什麼我不允許在函數「saveTags」中引用self.Tags?

(請不要說這應該是LackOfSkills而不是技能...;)

+0

檢查我的演示或者我已經粘貼示例代碼。它使用對象字面的方式來定義你的viewmodel。 –

回答

1

Here is a demo pen for you 。嘗試定義這樣您的視圖模型:

var tagsViewModel = { 
    // data 
    tagToAdd: ko.observable(""), // this is the new tag to add 
    tags: ko.observableArray([]), //empty collection 
    skills: ko.observableArray([]), 

// behaviors 
    addTag: function() { 
     var newTag = { Name: this.tagToAdd() }; 
     this.tagToAdd(""); 

     tagsViewModel.tags.push(newTag) 

    } 
}; 

ko.applyBindings(tagsViewModel); 

定義你的HTML這樣的:

<input type="text" placeholder="Add New Tag" data-bind="value: tagToAdd, valueUpdate: 'afterkeydown'" /> <button data-bind="click: addTag, enable: tagToAdd().length > 0" class="btn"><i class="icon-plus"></i> Add</button> 

<ul data-bind="foreach: tags" class=""> 
<!-- DEFINE UR LI HERE --> 
</ul> 
+1

@AsleG檢查我的演示或我粘貼的示例代碼。它使用對象字面的方式來定義你的viewmodel。 –

+1

@AsleG正如你可以在addtag函數中看到的那樣,我使用標籤,tagtoadd屬性,就像你可以從SaveTags函數中使用的一樣。只有名稱是不同的,但它是做同樣的事情,我猜即將項目添加到數組。 –

+0

@AsleG如果我的示例演示或上面的代碼解決了您的問題,或者通知您如何以正確的方式編寫您的vm,請接受我的解答作爲答案:P –

2

嘗試沒有()的:

self.Tags = ko.observableArray(); 
self.Skills = ko.observableArray(); 

self.Tags = foo說的self.Tags設爲是富。 self.Tags()說,self.Tags在一個函數中,你想調用它。這些都是合法的聲明。但self.Tags() = foo說self.Tags是一個你想調用的函數,並將它的值設置爲foo ...這是沒有意義的,並且不是任何語言的有效代碼。

1

您可以通過將其存儲在一個變量訪問您的視圖模型,如下所示:

function ViewModel() { 
    self.Tags = ko.observableArray(); 
    self.Skills = ko.observableArray(); 
} 
my = { viewModel: new ViewModel() }; 
ko.applyBindings(my.viewModel); 

然後你只需訪問my.Tags()

related answer

+1

此代碼無效,原因與OP發佈 –

+1

相同,只是複製粘貼他的代碼而未簽入。謝謝你現在修好了 –

+0

謝謝@Circadian!這與我的模型非常接近。內函數ViewModel(){}我有一個方法self.saveAll = function(){...} 它是從這個我想調用「saveTags()」作爲外部函數。 (如果我將「self.SaveTags()」作爲ViewModel內部方法包含在內,我也可以實現它。所以我可以通過引用my.Tasks()等來實現這一點。 –

1

這裏的問題是,你分配ko.observableArray();導致的呼叫self.Tags(),這就是爲什麼你的功能沒有存儲在self.Tags變量。我想正確的代碼如下:
如果你想分配結果的調用:

self.Tags = ko.observableArray(); 
self.Skills = ko.observableArray(); 

如果你想分配的功能鏈接後給他們打電話:

self.Tags = ko.observableArray; 
self.Skills = ko.observableArray; 
... 
// somewhere later 
self.Tags();